1> ## Documentation Index
2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt
3> Use this file to discover all available pages before exploring further.
4
5# プラグインにコンポーネントを追加する
6
7> スキル、フック、MCP サーバー、その他すべてのコンポーネントタイプを Claude Code プラグインに追加し、各コンポーネントの検証例を含めます。
8
9export const Piece = ({id, children}) => <div className="pe-piece" data-piece={id}>{children}</div>;
10
11export const PluginExplorer = ({children}) => {
12 const PIECES = [{
13 id: 'manifest',
14 name: 'Manifest',
15 path: '.claude-plugin/plugin.json',
16 required: "Required by Anthropic's directory",
17 lines: [{
18 depth: 0,
19 kind: 'folder',
20 text: '.claude-plugin/'
21 }, {
22 depth: 1,
23 kind: 'file',
24 text: 'plugin.json'
25 }],
26 href: '/en/plugins/manifest-reference#manifest-file',
27 linkText: 'Go to the manifest reference'
28 }, {
29 id: 'skills',
30 name: 'Skills',
31 path: 'skills/review/SKILL.md',
32 lines: [{
33 depth: 0,
34 kind: 'folder',
35 text: 'skills/'
36 }, {
37 depth: 1,
38 kind: 'folder',
39 text: 'review/'
40 }, {
41 depth: 2,
42 kind: 'file',
43 text: 'SKILL.md'
44 }],
45 href: '/en/plugins/components#skills',
46 linkText: 'Go to the Skills section'
47 }, {
48 id: 'commands',
49 name: 'Commands',
50 path: 'commands/about.md',
51 lines: [{
52 depth: 0,
53 kind: 'folder',
54 text: 'commands/'
55 }, {
56 depth: 1,
57 kind: 'file',
58 text: 'about.md'
59 }],
60 href: '/en/plugins/components#commands',
61 linkText: 'Go to the Commands section'
62 }, {
63 id: 'agents',
64 name: 'Agents',
65 path: 'agents/security-reviewer.md',
66 lines: [{
67 depth: 0,
68 kind: 'folder',
69 text: 'agents/'
70 }, {
71 depth: 1,
72 kind: 'file',
73 text: 'security-reviewer.md'
74 }],
75 href: '/en/plugins/components#agents',
76 linkText: 'Go to the Agents section'
77 }, {
78 id: 'hooks',
79 name: 'Hooks',
80 path: 'hooks/hooks.json',
81 lines: [{
82 depth: 0,
83 kind: 'folder',
84 text: 'hooks/'
85 }, {
86 depth: 1,
87 kind: 'file',
88 text: 'hooks.json'
89 }],
90 href: '/en/plugins/components#hooks',
91 linkText: 'Go to the Hooks section'
92 }, {
93 id: 'monitors',
94 name: 'Monitors',
95 path: 'monitors/monitors.json',
96 lines: [{
97 depth: 0,
98 kind: 'folder',
99 text: 'monitors/'
100 }, {
101 depth: 1,
102 kind: 'file',
103 text: 'monitors.json'
104 }],
105 href: '/en/plugins/components#monitors',
106 linkText: 'Go to the Monitors section'
107 }, {
108 id: 'output-styles',
109 name: 'Output styles',
110 path: 'output-styles/terse.md',
111 lines: [{
112 depth: 0,
113 kind: 'folder',
114 text: 'output-styles/'
115 }, {
116 depth: 1,
117 kind: 'file',
118 text: 'terse.md'
119 }],
120 href: '/en/plugins/components#themes-and-output-styles',
121 linkText: 'Go to the Themes and output styles section'
122 }, {
123 id: 'themes',
124 name: 'Themes',
125 path: 'themes/dracula.json',
126 lines: [{
127 depth: 0,
128 kind: 'folder',
129 text: 'themes/'
130 }, {
131 depth: 1,
132 kind: 'file',
133 text: 'dracula.json'
134 }],
135 href: '/en/plugins/components#themes-and-output-styles',
136 linkText: 'Go to the Themes and output styles section'
137 }, {
138 id: 'workflows',
139 name: 'Workflows',
140 path: 'workflows/audit-routes.js',
141 lines: [{
142 depth: 0,
143 kind: 'folder',
144 text: 'workflows/'
145 }, {
146 depth: 1,
147 kind: 'file',
148 text: 'audit-routes.js'
149 }],
150 href: '/en/workflows#distribute-a-workflow-in-a-plugin',
151 linkText: 'Go to Distribute a workflow in a plugin'
152 }, {
153 id: 'bin',
154 name: 'Executables',
155 path: 'bin/hello-plugin',
156 lines: [{
157 depth: 0,
158 kind: 'folder',
159 text: 'bin/'
160 }, {
161 depth: 1,
162 kind: 'file',
163 text: 'hello-plugin'
164 }],
165 href: '/en/plugins/components#executables',
166 linkText: 'Go to the Executables section'
167 }, {
168 id: 'scripts',
169 name: 'Scripts',
170 path: 'scripts/format.sh',
171 lines: [{
172 depth: 0,
173 kind: 'folder',
174 text: 'scripts/'
175 }, {
176 depth: 1,
177 kind: 'file',
178 text: 'format.sh'
179 }],
180 href: '/en/plugins/components#hooks',
181 linkText: 'Go to the Hooks section'
182 }, {
183 id: 'settings',
184 name: 'Default settings',
185 path: 'settings.json',
186 lines: [{
187 depth: 0,
188 kind: 'file',
189 text: 'settings.json'
190 }],
191 href: '/en/plugins/components#default-settings',
192 linkText: 'Go to the Default settings section'
193 }, {
194 id: 'mcp',
195 name: 'MCP servers',
196 path: '.mcp.json',
197 lines: [{
198 depth: 0,
199 kind: 'file',
200 text: '.mcp.json'
201 }],
202 href: '/en/plugins/components#mcp-servers',
203 linkText: 'Go to the MCP servers section'
204 }, {
205 id: 'lsp',
206 name: 'LSP servers',
207 path: '.lsp.json',
208 lines: [{
209 depth: 0,
210 kind: 'file',
211 text: '.lsp.json'
212 }],
213 href: '/en/plugins/components#lsp-servers',
214 linkText: 'Go to the LSP servers section'
215 }];
216 const [selectedId, setSelectedId] = useState('manifest');
217 const [isFullscreen, setIsFullscreen] = useState(false);
218 const rootRef = useRef(null);
219 useEffect(() => {
220 const onFsChange = () => setIsFullscreen(!!document.fullscreenElement);
221 document.addEventListener('fullscreenchange', onFsChange);
222 return () => document.removeEventListener('fullscreenchange', onFsChange);
223 }, []);
224 const toggleFullscreen = () => {
225 if (!rootRef.current) return;
226 if (document.fullscreenElement) document.exitFullscreen(); else rootRef.current.requestFullscreen().catch(() => {});
227 };
228 const selected = PIECES.find(p => p.id === selectedId) || PIECES[0];
229 const onTreeKeyDown = e => {
230 const keys = ['ArrowDown', 'ArrowUp', 'Home', 'End'];
231 if (keys.indexOf(e.key) === -1) return;
232 const i = PIECES.findIndex(p => p.id === selectedId);
233 let next = i;
234 if (e.key === 'ArrowDown') next = Math.min(PIECES.length - 1, i + 1);
235 if (e.key === 'ArrowUp') next = Math.max(0, i - 1);
236 if (e.key === 'Home') next = 0;
237 if (e.key === 'End') next = PIECES.length - 1;
238 e.preventDefault();
239 if (next === i) return;
240 const id = PIECES[next].id;
241 setSelectedId(id);
242 const el = document.getElementById('pe-node-' + id);
243 if (el) el.focus();
244 };
245 const FolderIcon = () => <svg className="pe-icon" width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinejoin="round" aria-hidden="true">
246 <path d="M1.5 4.5a1 1 0 0 1 1-1h3.2l1.3 1.5h6a1 1 0 0 1 1 1V12a1 1 0 0 1-1 1h-10.5a1 1 0 0 1-1-1z" />
247 </svg>;
248 const FileIcon = () => <svg className="pe-icon" width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinejoin="round" aria-hidden="true">
249 <path d="M4 1.5h5.5L13 5v9.5H4z" />
250 <path d="M9.5 1.5V5H13" />
251 </svg>;
252 return <div ref={rootRef} className={isFullscreen ? 'pe-root pe-fullscreen not-prose' : 'pe-root not-prose'} data-selected={selected.id}>
253 <style>{`
254 .pe-root {
255 --pe-mono: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
256 --pe-accent: #D97757;
257 --pe-accent-text: #A8502F;
258 --pe-accent-bg: rgba(217,119,87,0.10);
259 --pe-bg: #FFFFFF;
260 --pe-surface: #FAFAF7;
261 --pe-hover: #F0EEE6;
262 --pe-border: #E8E6DC;
263 --pe-text: #141413;
264 --pe-text-2: #3D3D3A;
265 --pe-text-3: #5E5D59;
266 font-family: inherit;
267 background: var(--pe-bg);
268 color: var(--pe-text);
269 border: 1px solid var(--pe-border);
270 border-radius: 12px;
271 margin: 1.5rem 0;
272 overflow: hidden;
273 box-sizing: border-box;
274 }
275 .dark .pe-root {
276 --pe-accent-text: #EBA98F;
277 --pe-accent-bg: rgba(217,119,87,0.18);
278 --pe-bg: #1A1918;
279 --pe-surface: #232221;
280 --pe-hover: #2E2D2B;
281 --pe-border: #3A3936;
282 --pe-text: #F1EFE9;
283 --pe-text-2: #D6D4CA;
284 --pe-text-3: #B8B5AD;
285 }
286 .pe-root *, .pe-root *::before, .pe-root *::after { box-sizing: border-box; }
287 .pe-head { display: flex; align-items: flex-start; gap: 12px; padding: 18px 24px 16px; border-bottom: 1px solid var(--pe-border); }
288 .pe-head-text { flex: 1; min-width: 0; }
289 .pe-fs-btn { flex-shrink: 0; width: 32px; height: 32px; display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--pe-border); border-radius: 6px; background: var(--pe-surface); color: var(--pe-text-2); font-size: 15px; line-height: 1; cursor: pointer; }
290 .pe-fs-btn:hover { background: var(--pe-hover); }
291 .pe-fs-btn:focus-visible { outline: 2px solid var(--pe-accent); outline-offset: 2px; }
292 .pe-fullscreen { border-radius: 0; height: 100vh; display: flex; flex-direction: column; overflow: auto; }
293 .pe-fullscreen .pe-body { flex: 1; }
294 .pe-title { font-size: 19px; font-weight: 600; line-height: 1.3; color: var(--pe-text); margin: 0; }
295 .pe-sub { font-size: 15px; line-height: 1.5; color: var(--pe-text-3); margin: 4px 0 0; }
296 .pe-sub code { font-family: var(--pe-mono); font-size: 0.88em; padding: 1px 5px; border-radius: 4px; background: var(--pe-surface); border: 1px solid var(--pe-border); }
297 .pe-body { display: flex; align-items: stretch; }
298 .pe-tree-pane { width: 270px; flex-shrink: 0; background: var(--pe-surface); border-right: 1px solid var(--pe-border); padding: 16px 0 12px; }
299 .pe-panel { flex: 1; min-width: 0; padding: 16px 24px 24px; }
300 .pe-caption { font-size: 13px; font-weight: 600; color: var(--pe-text-3); margin: 0 0 10px; }
301 .pe-tree-pane .pe-caption { padding: 0 16px; }
302 .pe-rootline { display: flex; align-items: center; gap: 7px; padding: 3px 16px; font-family: var(--pe-mono); font-size: 13.5px; color: var(--pe-text-3); }
303 .pe-node {
304 display: block; width: 100%; margin: 0; padding: 3px 16px 3px 30px; text-align: left; cursor: pointer;
305 background: transparent; color: var(--pe-text-2);
306 border: none; border-left: 3px solid transparent;
307 font-family: var(--pe-mono); font-size: 13.5px; line-height: 1.4;
308 }
309 .pe-node:hover { background: var(--pe-hover); }
310 .pe-node:focus-visible { outline: 2px solid var(--pe-accent); outline-offset: -2px; }
311 .pe-node[aria-pressed="true"] { background: var(--pe-accent-bg); border-left-color: var(--pe-accent); color: var(--pe-accent-text); font-weight: 600; }
312 .pe-line { display: flex; align-items: center; gap: 7px; padding: 2px 0; }
313 .pe-line-tree { flex-wrap: wrap; }
314 .pe-line-tree .pe-req { flex-basis: 100%; margin: 2px 0 0 22px; white-space: normal; width: fit-content; max-width: calc(100% - 22px); }
315 .pe-line span { overflow-wrap: anywhere; }
316 .pe-piece { display: none; font-size: 16px; line-height: 1.6; color: var(--pe-text-2); }
317 .pe-root[data-selected="manifest"] .pe-piece[data-piece="manifest"],
318 .pe-root[data-selected="skills"] .pe-piece[data-piece="skills"],
319 .pe-root[data-selected="commands"] .pe-piece[data-piece="commands"],
320 .pe-root[data-selected="agents"] .pe-piece[data-piece="agents"],
321 .pe-root[data-selected="hooks"] .pe-piece[data-piece="hooks"],
322 .pe-root[data-selected="monitors"] .pe-piece[data-piece="monitors"],
323 .pe-root[data-selected="output-styles"] .pe-piece[data-piece="output-styles"],
324 .pe-root[data-selected="themes"] .pe-piece[data-piece="themes"],
325 .pe-root[data-selected="workflows"] .pe-piece[data-piece="workflows"],
326 .pe-root[data-selected="bin"] .pe-piece[data-piece="bin"],
327 .pe-root[data-selected="scripts"] .pe-piece[data-piece="scripts"],
328 .pe-root[data-selected="settings"] .pe-piece[data-piece="settings"],
329 .pe-root[data-selected="mcp"] .pe-piece[data-piece="mcp"],
330 .pe-root[data-selected="lsp"] .pe-piece[data-piece="lsp"] { display: block; }
331 .pe-piece p { margin: 0 0 10px; }
332 .pe-piece p:last-child { margin-bottom: 0; }
333 .pe-piece code { font-family: var(--pe-mono); font-size: 0.88em; padding: 1px 5px; border-radius: 4px; background: var(--pe-surface); border: 1px solid var(--pe-border); }
334 .pe-piece .code-block { margin: 12px 0 0; }
335 .pe-piece pre code { padding: 0; border: none; background: none; }
336 .pe-piece a { color: var(--pe-accent-text); }
337 .pe-line-compact { display: none; }
338 .pe-icon { flex-shrink: 0; }
339 .pe-req { margin-left: 8px; padding: 0 6px; border-radius: 999px; font-size: 11px; line-height: 18px; letter-spacing: .02em; color: var(--pe-accent-text); border: 1px solid var(--pe-border); background: var(--pe-surface); white-space: nowrap; font-weight: 500; vertical-align: middle; }
340 .pe-name { font-size: 22px; font-weight: 600; line-height: 1.25; letter-spacing: -0.2px; color: var(--pe-text); margin: 0; }
341 .pe-path { font-family: var(--pe-mono); font-size: 13.5px; color: var(--pe-accent-text); margin: 4px 0 0; overflow-wrap: anywhere; }
342 .pe-block { margin: 20px 0 0; }
343 .pe-link {
344 display: inline-block; margin: 24px 0 0; padding: 8px 14px; border-radius: 8px;
345 font-size: 14.5px; font-weight: 600; text-decoration: none;
346 color: var(--pe-accent-text); background: var(--pe-accent-bg); border: 1px solid var(--pe-accent);
347 }
348 .pe-link:hover { filter: brightness(0.97); }
349 .pe-link:focus-visible { outline: 2px solid var(--pe-accent); outline-offset: 2px; }
350 @media (max-width: 700px) {
351 .pe-head { padding: 16px 16px 14px; }
352 .pe-body { flex-direction: column; }
353 .pe-tree-pane { width: 100%; border-right: none; border-bottom: 1px solid var(--pe-border); }
354 .pe-line-tree { display: none; }
355 .pe-line-compact { display: flex; }
356 .pe-panel { padding: 16px 16px 20px; }
357 }
358 `}</style>
359
360 <div className="pe-head">
361 <div className="pe-head-text">
362 <div className="pe-title">What goes in a plugin</div>
363 <div className="pe-sub">This example plugin, <code>my-plugin</code>, has one of every kind of component, each in its default location. Select a file or folder to read what it’s for and see what goes in it.</div>
364 </div>
365 <button type="button" className="pe-fs-btn" onClick={toggleFullscreen} aria-label={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'} title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}>
366 {isFullscreen ? '⤡' : '⛶'}
367 </button>
368 </div>
369
370 <div className="pe-body">
371 <div className="pe-tree-pane">
372 <div className="pe-caption" id="pe-tree-caption">Plugin directory</div>
373 <div role="group" aria-labelledby="pe-tree-caption" onKeyDown={onTreeKeyDown}>
374 <div className="pe-rootline"><FolderIcon /><span>my-plugin/</span></div>
375 {PIECES.map(p => <button key={p.id} id={'pe-node-' + p.id} type="button" className="pe-node" aria-pressed={p.id === selected.id} aria-label={p.name + ', ' + p.path} onClick={() => setSelectedId(p.id)}>
376 {p.lines.map((line, i) => <span key={i} className="pe-line pe-line-tree" style={{
377 paddingLeft: line.depth * 18 + 'px'
378 }}>
379 {line.kind === 'folder' ? <FolderIcon /> : <FileIcon />}
380 <span>{line.text}</span>
381 {p.required && i === p.lines.length - 1 ? <span className="pe-req">{p.required}</span> : null}
382 </span>)}
383 <span className="pe-line pe-line-compact">
384 <FileIcon />
385 <span>{p.path}</span>
386 {p.required ? <span className="pe-req">{p.required}</span> : null}
387 </span>
388 </button>)}
389 </div>
390 </div>
391
392 <div className="pe-panel" role="region" aria-labelledby="pe-panel-caption" aria-live="polite" aria-atomic="true">
393 <div className="pe-caption" id="pe-panel-caption">Selected piece</div>
394 <div className="pe-name">{selected.name}{selected.required ? <span className="pe-req">{selected.required}</span> : null}</div>
395 <div className="pe-path">{selected.path}</div>
396
397 <div className="pe-block">{children}</div>
398
399 <a className="pe-link" href={selected.href}>{selected.linkText}</a>
400 </div>
401 </div>
402 </div>;
403};
404
405Claude Code プラグインはスキル、エージェント、フック、MCP サーバーなどのコンポーネントから構築されます。各コンポーネントはプラグイン内にデフォルトフォルダを持ち、`.claude-plugin/plugin.json` 内のオプションのマニフェストキーがそのフォルダを置き換えるか追加し、ユーザーが見る名前があります。各キーの完全なフィールドテーブルについては、[マニフェストリファレンス](/docs/ja/plugins/manifest-reference#fields)を参照してください。
406
407このページを使用して、既に読み込まれているプラグインにコンポーネントを追加します。
408
409コンポーネントを追加した後、実行中のセッションで `/reload-plugins` を実行するか、新しいセッションを開始して Claude Code がそれを読み込むようにします。コンポーネントのファイルを読み込む前に確認するには、プラグインディレクトリからシェルで [`claude plugin validate .`](/docs/ja/plugins/cli-reference#plugin-validate) を実行します。
410
411<Note>
412 これらのケースは他のページで説明されています:
413
414 * **最初のプラグインを構築する**:[プラグインを作成する](/docs/ja/plugins/create)から始めます
415 * **他のユーザーのプラグインをインストールする**:[プラグインをインストールする](/docs/ja/plugins/install)を参照してください
416 * **プラグインのユーザーが claude.ai または Cowork にいる**:異なるセットのコンポーネントがそこに読み込まれます。[claude.ai と Cowork のプラグイン](https://claude.com/docs/plugins/overview)を参照してください
417</Note>
418
419<h2 id="explore-the-plugin-directory">
420 プラグインディレクトリを探索する
421</h2>
422
423エクスプローラーは、デフォルトの場所にあらゆる種類のコンポーネントを 1 つずつ持つ例のプラグイン `my-plugin` を示しています:
424
425* レビュースキルと `about` コマンド
426* セキュリティレビューサブエージェント
427* Claude がファイルを編集した後にファイルをフォーマットするフック、およびそれが呼び出す `scripts/` フォルダ
428* ログモニター
429* 出力スタイルとカラーテーマ
430* ルート監査ワークフロー
431* `hello-plugin` 実行可能ファイル
432* デフォルト設定
433* ローカル MCP サーバーと Go 言語サーバー
434
435各ファイルはその形式の最小限の有効な例であり、有用であるためではなく形状を示すためにあります:実際のスキルまたはエージェントは完全な指示を持ち、多くの場合サポートファイルを含み、実際のフックまたはモニターは実際の作業を行います。エクスプローラーの後のセクションはエクスプローラーと同じファイルを例として使用し、より完全なものへのリンクを提供します。ファイルまたはフォルダを選択して、それが何のためにあるのか、何が含まれるのか、それをカバーするセクションを見つけます。
436
437<PluginExplorer>
438 <Piece id="manifest">
439 [マニフェスト](/docs/ja/plugins/manifest-reference)はプラグインの `.claude-plugin/` ディレクトリ内の `plugin.json` ファイルです。プラグインのメタデータと、Claude Code がユーザーに求める `userConfig` 値が含まれます。`name` のみが必須です。このマニフェストでは、`description` はユーザーが `/plugin` でプラグインに対して見るテキストであり、`version` はユーザーをそのバージョンに保ちます。変更するまで:
440
441 ```json theme={null}
442 {
443 "name": "my-plugin",
444 "version": "1.0.0",
445 "description": "Review, formatting, and database tools for this team"
446 }
447 ```
448 </Piece>
449
450 <Piece id="skills">
451 [スキル](/docs/ja/skills)は `SKILL.md` ファイルです。各スキルを `skills/` の下の独自のディレクトリに保存します。Claude はすべてのスキルの `description` を読み、ユーザーが求めるものがそれと一致する場合(ここでプルリクエストをレビューするよう Claude に求めるなど)、Claude はスキルの指示を読み込んでそれに従います。ユーザーは `/my-plugin:review` として直接実行することもできます:
452
453 ```markdown theme={null}
454 ---
455 description: Reviews a pull request for style and test coverage. Use when asked to review code.
456 ---
457
458 Review the changed files. Report style problems first, then missing tests.
459 ```
460 </Piece>
461
462 <Piece id="commands">
463 コマンドは、ユーザーが名前で実行する単一の Markdown ファイルです。コマンドは古い形式です:スキルは同じ方法で名前で実行でき、独自のディレクトリにサポートファイルを含めることもできるため、新しいものはスキルとして記述し、既に持っているファイルについては `commands/` を保持します。このファイルは `/my-plugin:about` になり、スキルと同じフロントマターを取ります:
464
465 ```markdown theme={null}
466 ---
467 description: Summarize the repository
468 ---
469
470 Summarize what this repository does in three sentences.
471 ```
472 </Piece>
473
474 <Piece id="agents">
475 [サブエージェント](/docs/ja/sub-agents)は、独自の指示と独自のコンテキストウィンドウを持つ別のアシスタントであり、Claude がタスクを委譲して結果を取得できます。`agents/` の下の各 Markdown ファイルは 1 つを定義します:フロントマターはそれに名前を付け、いつ使用するかを言い、本文はそのシステムプロンプトです。このファイルは `my-plugin:security-reviewer` という名前で、ユーザーは `@agent-my-plugin:security-reviewer` で呼び出すことができます:
476
477 ```markdown theme={null}
478 ---
479 name: security-reviewer
480 description: Reviews code changes for security issues. Use after edits to authentication or input handling.
481 model: sonnet
482 ---
483
484 You are a security reviewer. Read the changed files and report injection, authentication, and secrets-handling risks.
485 ```
486 </Piece>
487
488 <Piece id="hooks">
489 [フック](/docs/ja/hooks-guide)は Claude Code のライフサイクルの特定の時点(すべてのファイル編集後など)で自動的に何かを実行します:シェルコマンド、HTTP リクエスト、MCP ツール呼び出し、モデルへのプロンプト、またはサブエージェント。プラグインのフックをプラグインルートの `hooks/hooks.json` に保存します。このフックは Claude がファイルを書き込むか編集した後、プラグインの `scripts/format.sh` を実行します:
490
491 ```json theme={null}
492 {
493 "hooks": {
494 "PostToolUse": [
495 {
496 "matcher": "Write|Edit",
497 "hooks": [
498 {
499 "type": "command",
500 "command": "\"${CLAUDE_PLUGIN_ROOT}/scripts/format.sh\""
501 }
502 ]
503 }
504 ]
505 }
506 }
507 ```
508 </Piece>
509
510 <Piece id="monitors">
511 モニターはシェルコマンドで、Claude Code はセッションの開始時にバックグラウンドで開始し、セッションが終了するまで実行し続け、[Monitor ツール](/docs/ja/tools-reference#monitor-tool)を使用します。それが出力するものは Claude に通知として到達します。`when` フィールドは、代わりに名前付きスキルが初めて実行されるときに開始できます。このモニターはエラーログをテールします:
512
513 ```json theme={null}
514 [
515 {
516 "name": "error-log",
517 "command": "tail -F ./logs/error.log",
518 "description": "Application error log"
519 }
520 ]
521 ```
522 </Piece>
523
524 <Piece id="output-styles">
525 プラグインは[出力スタイル](/docs/ja/output-styles)を含めることができます。これは Claude が返信をフォーマットおよび表現する方法を変更します。各出力スタイルを `output-styles/<name>.md` として保存します。このスタイルは `/output-style` に `my-plugin:terse` として表示されます:
526
527 ```markdown theme={null}
528 ---
529 name: terse
530 description: Answer in as few words as possible
531 keep-coding-instructions: true
532 ---
533
534 Keep every reply short. Skip preambles and summaries.
535 ```
536 </Piece>
537
538 <Piece id="themes">
539 プラグインは Claude Code インターフェースの[カラーテーマ](/docs/ja/terminal-config#create-a-custom-theme)を含めることができます。各テーマを `themes/<slug>.json` として保存します。このテーマは `/theme` に `Dracula` として表示され、`my-plugin` からのものとしてマークされます:
540
541 ```json theme={null}
542 {
543 "name": "Dracula",
544 "base": "dark",
545 "overrides": {
546 "claude": "#bd93f9",
547 "error": "#ff5555"
548 }
549 }
550 ```
551 </Piece>
552
553 <Piece id="workflows">
554 `workflows/` フォルダは[ワークフロー](/docs/ja/workflows) `.js` ファイルを保持します:`meta` ブロック、その後、複数のサブエージェントを調整するスクリプト本文。このファイルは `/my-plugin:audit-routes` として実行されます:
555
556 ```javascript theme={null}
557 export const meta = {
558 name: 'audit-routes',
559 description: 'Audit every route handler for missing auth checks',
560 }
561
562 const found = await agent('List every .ts file under src/routes/.', {
563 schema: { type: 'object', required: ['files'], properties: { files: { type: 'array', items: { type: 'string' } } } },
564 })
565
566 const audits = await pipeline(found.files, file =>
567 agent(`Audit ${file} for missing authentication checks.`, { label: file }),
568 )
569
570 return audits.filter(Boolean)
571 ```
572 </Piece>
573
574 <Piece id="bin">
575 `bin/` はプラグインがコマンドラインツールを配布する方法です。プラグインが有効な間、Claude Code はこのフォルダをシェルの `PATH` に配置するため、Claude またはスキルの指示は、ユーザーが何もインストールすることなく、ツールを名前で実行できます。この[実行可能ファイル](#executables)が配置されている場合、`hello-plugin` は Claude が実行できるコマンドです:
576
577 ```bash theme={null}
578 #!/bin/bash
579 echo "hello from my-plugin"
580 ```
581 </Piece>
582
583 <Piece id="scripts">
584 `hooks/hooks.json` のフックはスクリプトを実行し、このフォルダは例がそれを保持する場所です。`scripts/` という名前は慣例であり、Claude Code が探すものではありません:フックはファイルをそのパス `${CLAUDE_PLUGIN_ROOT}/scripts/format.sh` で指します。フォーマッタスクリプトは次のようになります:
585
586 ```bash theme={null}
587 #!/bin/bash
588 npx prettier --write .
589 ```
590 </Piece>
591
592 <Piece id="settings">
593 プラグインルートの `settings.json` は、プラグインが有効な間に適用される[設定](/docs/ja/settings-reference)を保持するため、プラグインはセッションの動作を変更でき、コンポーネントを追加するだけではありません。プラグインから効果を発揮するのは 2 つのキーのみです。[`agent`](/docs/ja/settings-reference#agent) と [`subagentStatusLine`](/docs/ja/settings-reference#subagentstatusline);他のすべてのキーは削除されます。[デフォルト設定](#default-settings)を参照してください。
594
595 このファイルは `agent` を設定し、セッションのメインスレッドをプラグイン独自の `security-reviewer` エージェントとして実行するため、そのエージェントのシステムプロンプト、ツール制限、およびモデルがセッション全体に適用されます:
596
597 ```json theme={null}
598 {
599 "agent": "security-reviewer"
600 }
601 ```
602 </Piece>
603
604 <Piece id="mcp">
605 [MCP サーバー](/docs/ja/mcp)は Claude に外部システムからのツールを提供します。プラグインルートの `.mcp.json` で宣言します。このサーバーはプラグイン内のスクリプトからローカルサーバーを開始し、`/mcp` に `plugin:my-plugin:db` として表示されます:
606
607 ```json theme={null}
608 {
609 "mcpServers": {
610 "db": {
611 "command": "node",
612 "args": ["${CLAUDE_PLUGIN_ROOT}/server.js"]
613 }
614 }
615 }
616 ```
617 </Piece>
618
619 <Piece id="lsp">
620 LSP サーバーは Claude に言語の[診断とコードナビゲーション](/docs/ja/plugins/code-intelligence)を提供します。プラグインルートの `.lsp.json` でサーバーを宣言します。このサーバーは `.go` ファイルの Go 言語サーバーを接続します:
621
622 ```json theme={null}
623 {
624 "gopls": {
625 "command": "gopls",
626 "args": ["serve"],
627 "extensionToLanguage": {
628 ".go": "go"
629 }
630 }
631 }
632 ```
633 </Piece>
634</PluginExplorer>
635
636<h2 id="add-each-kind-of-component">
637 各種コンポーネントを追加する
638</h2>
639
640以下の各セクションでは、1 つの種類のコンポーネントについて説明します。プラグイン内のファイルの場所、検証するサンプル、プラグインが読み込まれた後にユーザーが見るもの、デフォルトの場所を変更するマニフェストキーです。プラグインに必要なものを追加してください。どれも必須ではありません。
641
642<h3 id="skills">
643 Skills
644</h3>
645
646[skill](/docs/ja/skills) は、Claude がその説明がタスクと一致するときに読み込める `SKILL.md` ファイルです。ユーザーはコマンドとして実行することもできます。各スキルを `skills/` の下の独自のディレクトリに保存します。
647
648```text theme={null}
649my-plugin/
650├── .claude-plugin/
651│ └── plugin.json
652└── skills/
653 └── review/
654 └── SKILL.md
655```
656
657`SKILL.md` に `description` を付けて、Claude がいつそれを使用するかを知るようにします。
658
659```markdown skills/review/SKILL.md theme={null}
660---
661description: Reviews a pull request for style and test coverage. Use when asked to review code.
662---
663
664Review the changed files. Report style problems first, then missing tests.
665```
666
667プラグインを読み込んだ後、`/my-plugin:review` がスキルを実行します。コマンド名と誰がそれを呼び出せるかは、以下のルールに従います。
668
669* **コマンド名**: `/<plugin>:<directory>` なので、`my-plugin` の `skills/review/SKILL.md` は `/my-plugin:review` です。フロントマターで `name` を設定すると、最後のセグメントが置き換わり、プラグインプレフィックスは残ります。[スキルがコマンド名を取得する方法](/docs/ja/skills#how-a-skill-gets-its-command-name)を参照してください。
670* **誰が呼び出すか**: Claude、ユーザー、またはその両方。フロントマターで制御されます。[スキルの呼び出し者を制御する](/docs/ja/skills#control-who-invokes-a-skill)を参照してください。
671
672スキルはデフォルトの `skills/` ディレクトリの外に配置することもできます。
673
674* **追加ディレクトリ**: `skills` マニフェストキーにリストします。`commands` と `agents` とは異なり、デフォルトの `skills/` スキャンを置き換えるのではなく、追加します。
675* **プラグインルートの単一スキル**: `skills/` ディレクトリがなく、`skills` マニフェストキーがない場合、プラグインルートの `SKILL.md` は 1 つのスキルとして読み込まれます。フロントマターで `name` を設定してください。そうしないと、マーケットプレイスのインストールはスキルをプラグイン名ではなく、その[キャッシュディレクトリ](/docs/ja/plugins/loading#find-plugins-on-disk)の後に名前を付けます。
676
677プラグインに指示を含めるには、スキルとして記述します。Claude Code はプラグインルートの `CLAUDE.md` を読み込まず、`claude plugin validate` は `CLAUDE.md at the plugin root is not loaded as project context` と警告します。
678
679フロントマターフィールドとサポートファイルについては、[Skills](/docs/ja/skills) を参照してください。
680
681<h3 id="commands">
682 Commands
683</h3>
684
685コマンドは、ユーザーが `/my-plugin:about` などの名前で実行する単一の Markdown ファイルです。
686
687<Note>
688 コマンドは古い形式であり、[スキル](#skills)は新しい作業ではそれに取って代わります。スキルは同じ方法で名前で実行でき、ディレクトリ内にサポートファイルを含めることもできます。`.claude/commands/` から移動しているファイルについては、`commands/` を保持してください。
689</Note>
690
691コマンドを `commands/<file>.md` に保存すると、`/<plugin>:<file>` になります。サブディレクトリはセグメントを追加するため、`commands/db/migrate.md` は `/my-plugin:db:migrate` です。
692
693コマンドファイルはスキルと同じフロントマターを取ります。
694
695<h4 id="define-commands-in-the-manifest">
696 マニフェストでコマンドを定義する
697</h4>
698
699これが必要なのは、コマンドファイルを `commands/` 以外の場所に保持したい場合、または `plugin.json` 内に個別の Markdown ファイルなしで短いコマンドを定義したい場合のみです。`commands` マニフェストキーを設定すると、Claude Code は `commands/` をスキャンする代わりにそれを読み取ります。キーはパス、パスの配列、または各コマンド名を `source` ファイルまたはインライン `content` にマップするオブジェクトを取ります。
700
701このマニフェストは `/my-plugin:about` をインラインで定義し、Markdown ファイルはありません。
702
703```json .claude-plugin/plugin.json theme={null}
704{
705 "name": "my-plugin",
706 "commands": {
707 "about": {
708 "content": "Summarize what this repository does in three sentences.",
709 "description": "Summarize the repository"
710 }
711 }
712}
713```
714
715プラグインを読み込み、セッションで `/my-plugin:about` を実行して、読み込まれたことを確認します。
716
717完全なキー構文については、[`commands`](/docs/ja/plugins/manifest-reference#commands) を参照してください。
718
719<h3 id="agents">
720 Agents
721</h3>
722
723[subagent](/docs/ja/sub-agents) は、独自の指示とコンテキストウィンドウを持つ別のアシスタントで、Claude がタスクを委譲できます。`agents/` の下の各 Markdown ファイルは 1 つを定義します。
724
725```markdown agents/security-reviewer.md theme={null}
726---
727name: security-reviewer
728description: Reviews code changes for security issues. Use after edits to authentication or input handling.
729model: sonnet
730---
731
732You are a security reviewer. Read the changed files and report injection, authentication, and secrets-handling risks.
733```
734
735このエージェントは `my-plugin:security-reviewer` という名前で、ユーザーは `@agent-my-plugin:security-reviewer` で[明示的に呼び出す](/docs/ja/sub-agents#invoke-subagents-explicitly)ことができます。名前の形式は `<plugin>:<name>` で、`<name>` はフロントマターから、またはファイル名がない場合はファイル名から来ます。
736
737`agents` マニフェストキーは `agents/` スキャンを置き換えます。
738
739<h4 id="organize-agents-in-subfolders">
740 エージェントをサブフォルダに整理する
741</h4>
742
743プラグインエージェントファイルを `agents/` のサブフォルダに配置できます。Claude Code は[それらを再帰的に読み込み](/docs/ja/sub-agents#choose-the-subagent-scope)、プラグイン名、各サブフォルダ名、ファイル名をコロンで結合して、エージェントのスコープ付き名を形成します。たとえば、`my-plugin` という名前のプラグインの `agents/review/security.md` は `my-plugin:review:security` として読み込まれます。2 つの設定がその名前を変更します。
744
745* フロントマター `name`: ファイル名のみを置き換えるため、`agents/review/security.md` の `name: audit` は `my-plugin:review:audit` として読み込まれます。
746* マニフェスト [`agents`](/docs/ja/plugins/manifest-reference#fields) フィールド: そこにリストされたファイルはサブフォルダ名なしで読み込まれるため、`"agents": "./custom/review/security.md"` は `my-plugin:security` として読み込まれます。
747
748<h4 id="frontmatter-fields-in-plugin-agents">
749 プラグインエージェントのフロントマターフィールド
750</h4>
751
752プラグインエージェントのフロントマターは、以下のルールに従います。
753
754* **サポートされているフィールド**: `name`、`description`、`model`、`effort`、`maxTurns`、`tools`、`disallowedTools`、`skills`、`memory`、`background`、`omitClaudeMd`、`isolation`、`color`、および `experimental` の `cacheTtl` キー。唯一の有効な `isolation` 値は `"worktree"` です。各フィールドが何をするかについては、[サポートされているフロントマターフィールド](/docs/ja/sub-agents#supported-frontmatter-fields)を参照してください。
755* **無視されるフィールド**: `permissionMode`、`hooks`、`mcpServers`、および `initialPrompt`。エージェントファイルは独自にフックまたは MCP サーバーを追加できないため、代わりにプラグイン[フック](#hooks)と[MCP サーバー](#mcp-servers)として追加してください。
756* **解析されないフロントマター**: エージェントはすべてのフィールドが無視された状態で読み込まれます。ファイルの後に名前が付けられ、その説明は `Agent from my-plugin plugin` と読みます。シェルで [`claude plugin validate`](/docs/ja/plugins/cli-reference#plugin-validate) を実行して、これらのファイルを見つけます。
757
758各フィールドが何をするかと優先順位ルールについては、[Subagents](/docs/ja/sub-agents#supported-frontmatter-fields) を参照してください。
759
760<h3 id="hooks">
761 Hooks
762</h3>
763
764[フック](/docs/ja/hooks-guide)は、Claude Code のライフサイクルの特定の時点(すべてのファイル編集後など)で自動的に何かを実行します。シェルコマンド、HTTP リクエスト、MCP ツール呼び出し、モデルへのプロンプト、またはサブエージェント。プラグインのフックを、プラグインルートの `hooks/hooks.json` に保存し、トップレベルの `"hooks"` キーの下に、`settings.json` の `hooks` オブジェクトと同じ形で保存します。これにより、既存の設定フックを変更なしでコピーできます。
765
766このフックは、すべての `Write` または `Edit` の後にバンドルされたスクリプトを実行します。
767
768```json hooks/hooks.json theme={null}
769{
770 "hooks": {
771 "PostToolUse": [
772 {
773 "matcher": "Write|Edit",
774 "hooks": [
775 {
776 "type": "command",
777 "command": "\"${CLAUDE_PLUGIN_ROOT}/scripts/format.sh\""
778 }
779 ]
780 }
781 ]
782 }
783}
784```
785
786スクリプトを `scripts/format.sh` に保存し、実行可能にします。
787
788プラグインを読み込み、Claude にファイルを編集するよう依頼します。終了 0 の `PostToolUse` フックはトランスクリプトに何も表示しないため、[デバッグログ](/docs/ja/hooks#debug-hooks)で実行されたことを確認するか、スクリプト自体が変更したもので確認します。
789
790`hooks/hooks.json` のフックと `hooks` マニフェストキーの両方が読み込まれます。すべてのイベントとそのペイロードについては、[Hook events](/docs/ja/hooks#hook-events) を参照してください。
791
792<h4 id="when-plugin-hooks-fire">
793 プラグインフックが発火するとき
794</h4>
795
796プラグインのフックは、プラグインのスキルまたはコマンドの 1 つが使用されるのを待ちません。Claude Code はセッションがプラグインを読み込むときにそれらを登録し、その後、それらのイベントで発火します。フックが実行されるときを制限するには、その `matcher` を絞ります。
797
798フックが発火しない場合は、[発火しないフック](/docs/ja/plugins/troubleshooting#failed-to-load-hooks-from-and-hooks-that-dont-fire)を参照してください。
799
800<h4 id="environment-quoting-and-matching-mcp-tools">
801 環境、クォート、および MCP ツールのマッチング
802</h4>
803
804フックの環境、`${CLAUDE_PLUGIN_ROOT}` のクォート、およびプラグイン独自の MCP ツールのマッチャーは、以下のように機能します。
805
806* **環境**: すべてのフックプロセスは、その環境で `CLAUDE_PLUGIN_ROOT` と `CLAUDE_PLUGIN_DATA` を受け取り、各[ユーザー設定](#user-configuration)値に対して `CLAUDE_PLUGIN_OPTION_<KEY>` を受け取るため、スクリプトはそこからそれらを読み取ることができます。
807* **クォート**: `command` に `args` がない場合、シェルを通じて実行されるため、`hooks/hooks.json` の例の下の [Hooks](#hooks) で行うように、`${CLAUDE_PLUGIN_ROOT}` パスを二重引用符で囲んで、展開されたパスを 1 つのシェルワードに保ちます。代わりに `args` を渡す場合、各要素は 1 つの引数として渡され、シェルなしで、クォートは不要です。[exec form と shell form](/docs/ja/hooks#exec-form-and-shell-form) を参照してください。
808* **プラグイン独自の MCP ツールのマッチング**: このプラグインが宣言する [MCP サーバー](#mcp-servers)からのツールは `mcp__plugin_<plugin>_<server>__<tool>` という名前が付けられるため、マッチャーにその完全な名前を記述します。サーバー名だけのマッチャーは発火しません。[MCP ツールのマッチング](/docs/ja/hooks#match-mcp-tools)を参照してください。
809
810<h3 id="mcp-servers">
811 MCP servers
812</h3>
813
814MCP サーバーは、外部システムから Claude にツールを提供します。プラグインルートの `.mcp.json` で宣言し、[プロジェクト `.mcp.json`](/docs/ja/mcp#project-scope) と同じ形で宣言します。この `.mcp.json` は `db` という名前の 1 つのサーバーを宣言します。
815
816```json .mcp.json theme={null}
817{
818 "mcpServers": {
819 "db": {
820 "command": "node",
821 "args": ["${CLAUDE_PLUGIN_ROOT}/server.js"]
822 }
823 }
824}
825```
826
827`mcpServers` ラッパーを省略して、`db` をファイルのトップレベルに配置することもできます。
828
829プラグインを読み込み、`/mcp` を実行して、サーバーが `plugin:my-plugin:db` として表示されることを確認します。
830
831`claude plugin validate` は `.mcp.json` をチェックし、Claude Code が読み込み時にドロップするサーバーエントリをエラーとして報告します。Claude Code v2.1.281 以降が必要です。
832
833不正なエントリが読み込み時にどこに表示されるかについては、[開始しない MCP サーバー](/docs/ja/plugins/troubleshooting#invalid-mcp-server-config-for-and-mcp-servers-that-dont-start)を参照してください。
834
835`mcpServers` マニフェストキーは、インラインサーバーマップ、JSON ファイルへのパス、またはそれらの配列を取ります。マニフェストサーバーが `.mcp.json` のものと同じ名前を持つ場合、マニフェストサーバーがそれを置き換えます。
836
837<h4 id="reach-users-on-claude-ai-and-cowork">
838 claude.ai と Cowork でユーザーに到達する
839</h4>
840
841ローカル stdio サーバー([MCP サーバー](#mcp-servers)の下の `db` サーバーなど)は Claude Code と、Claude Desktop アプリでマシン上で実行される Cowork セッションで実行されますが、claude.ai では実行されません。そこでもユーザーに到達するには、`https://` URL でリモートサーバーを参照します。これは claude.ai と Cowork がコネクタとしてユーザーに提供します。
842
843<h4 id="server-names-tool-names-and-reloads">
844 サーバー名、ツール名、およびリロード
845</h4>
846
847サーバーの名前、変数置換、およびリロード動作は、以下のルールに従います。
848
849* **サーバー名**: `plugin:<plugin>:<server>` なので、`my-plugin` の `db` サーバーは `/mcp` の `plugin:my-plugin:db` です。[`mcp_tool` フック](/docs/ja/hooks#mcp-tool-hook-fields)でサーバーに名前を付けるときに同じ形式を使用します。
850* **ツール名**: `mcp__plugin_<plugin>_<server>__<tool>` なので、その `db` サーバーの `query` ツールは `mcp__plugin_my-plugin_db__query` です。これは[権限ルール](/docs/ja/permissions)と[フックマッチャー](#mcp-servers)で使用する名前です。
851* **置換**: `${CLAUDE_PLUGIN_ROOT}` および他の[パス変数](#path-variables-and-persistent-data)は、`command`、`args`、および `env` で置換されます。各要素が 1 つの引数として渡されるため、`args` ではクォートは不要です。
852* **リロード**: ユーザーが `/reload-plugins` を実行し、[リロードが適用される](/docs/ja/plugins/cli-reference#reloads-that-change-mcp-tools)場合、構成が変更されていないサーバーは接続を保持します。構成が変更されたサーバーは再接続し、削除したサーバーは切断されます。
853
854<h4 id="include-a-packaged-mcpb-server">
855 パッケージ化された MCPB サーバーを含める
856</h4>
857
858`mcpServers` キーは、拡張子が `.mcpb` または古い `.dxt` である[MCPB ファイル](https://github.com/modelcontextprotocol/mcpb)としてパッケージ化されたサーバーも受け入れます。キーをファイルに指定します。プラグイン内のパスまたは `https://` URL として。
859
860```json .claude-plugin/plugin.json theme={null}
861{
862 "name": "my-plugin",
863 "mcpServers": "./servers/db.mcpb"
864}
865```
866
867サーバーはバンドルのマニフェストの `name` からその名前を取ります。
868
869トランスポートと認証については、[MCP](/docs/ja/mcp#plugin-provided-mcp-servers) を参照してください。
870
871<h3 id="lsp-servers">
872 LSP servers
873</h3>
874
875LSP サーバーは、Claude に言語の診断とコードナビゲーションを提供します。[公式コードインテリジェンスプラグイン](/docs/ja/plugins/code-intelligence)がすでに言語をカバーしている場合は、1 つを記述する代わりにそれをインストールしてください。そうでない場合は、プラグインルートの `.lsp.json` で宣言します。
876
877```json .lsp.json theme={null}
878{
879 "gopls": {
880 "command": "gopls",
881 "args": ["serve"],
882 "extensionToLanguage": {
883 ".go": "go"
884 }
885 }
886}
887```
888
889ファイルは各サーバー名を直接その構成にマップし、マップの周りにラッパーオブジェクトはありません。`command` はバイナリの名前で、その引数は `args` にあります。`extensionToLanguage` には少なくとも 1 つの拡張子が必要で、各拡張子は `.` で始まります。
890
891`claude plugin validate` はこのファイルを読み取りません。エントリが無効な場合、ファイル全体は読み込み時にスキップされ、`Invalid LSP server config for ".lsp.json"` が `/plugin` **Errors** タブに表示されます。
892
893プラグインは接続を構成しますが、サーバーバイナリをインストールしません。各ファイル拡張子は 1 つのサーバーを取得します。
894
895* **バイナリがない**: Claude Code はユーザーの `PATH` から名前で `command` を開始します。バイナリがない場合、サーバーは開始に失敗し、`claude --debug` は `LSP server <name> failed to start` をログに記録します。
896* **拡張子の競合**: 2 つの有効なサーバーが同じ拡張子を要求する場合、最初に登録されたサーバーがそれらのファイルを処理し、もう 1 つはそれらのファイルには使用されません。サーバーが 1 つのプラグインから来ても 2 つから来ても。`/plugin` **Errors** タブは警告 `LSP server "<name>" is not used for <ext> files` を表示します。
897
898`lspServers` マニフェストキーは同じマップをインラインで、JSON ファイルへのパス、またはそれらの配列として取り、そのサーバーは `.lsp.json` のものに追加されます。マニフェストサーバーが `.lsp.json` のものと同じ名前を持つ場合、マニフェストサーバーがそれを置き換えます。
899
900`transport`、タイムアウト、再起動、およびその他のフィールドについては、[`lspServers`](/docs/ja/plugins/manifest-reference#lspservers) を参照してください。
901
902ログ出力を stdout ではなく stderr に送信します。Claude Code はサーバーの stdout をプロトコルメッセージとしてのみ読み取り、メッセージヘッダーは最大 64 KiB、メッセージ本体は最大 32 MiB を受け入れます。
903
904Claude Code は、いずれかの制限を超えるサーバーを切断するか、stdout に非プロトコル出力を書き込み、切断を `restartOnCrash` と `maxRestarts` のクラッシュとしてカウントします。`--debug` で実行すると、Claude Code は原因を名前で指定するエラーをデバッグログに書き込みます。
905
906<h3 id="executables">
907 Executables
908</h3>
909
910プラグインルートの `bin/` 内のファイルは、プラグインが有効な間、Bash ツールのシェルの `PATH` 上にあるため、Claude はそれらをベアコマンドとして実行できます。実行可能なスクリプトを追加します。
911
912```bash bin/hello-plugin theme={null}
913#!/bin/bash
914echo "hello from my-plugin"
915```
916
917`chmod +x bin/hello-plugin` で実行可能にし、プラグインを読み込みます。Claude に `hello-plugin` を実行するよう依頼すると、Bash ツールの結果はスクリプトの出力を表示します。
918
919プラグイン `bin/` ディレクトリはユーザー独自の `PATH` エントリの後に来るため、プラグインは `git`、`ls`、または別のシステムコマンドをシャドウできません。
920
921claude.ai と Cowork は、トップレベルの `bin/` ディレクトリを持つプラグイン([claude.ai 組織設定を通じて配布する](/docs/ja/plugins/host-marketplace#distribute-through-organization-settings)ものを含む)をインストールしません。
922
923<h3 id="default-settings">
924 Default settings
925</h3>
926
927プラグインが有効な間に適用されるデフォルトを設定するには、プラグインルートに `settings.json` を追加するか、同じオブジェクトを `settings` マニフェストキーにインラインで配置します。2 つのキーが有効になり、`agent` と `subagentStatusLine` で、他のすべてのキーは削除されます。
928
929プラグイン独自のエージェントの 1 つをメインスレッドとして実行するように `agent` を設定します。
930
931```json settings.json theme={null}
932{
933 "agent": "security-reviewer"
934}
935```
936
937プラグインを読み込み、セッションを開始します。Claude はメイン会話で `security-reviewer` エージェントのシステムプロンプトとモデルで応答します。
938
939キーが制御するすべてのものについては、[`agent` 設定](/docs/ja/settings-reference#agent)を参照してください。
940
941同じキーが複数の場所で設定されている場合、これらのルールは、どの値が適用されるかを決定します。
942
943* **ファイルがマニフェストより優先**: 両方が存在し、`settings.json` が少なくとも 1 つのサポートされているキーを設定する場合、`settings.json` が適用され、マニフェストの `settings` は無視されます。
944* **ユーザー設定がプラグインのデフォルトより優先**: 設定ソース全体で、プラグインのデフォルトは最下位レイヤーであるため、ユーザー独自の `~/.claude/settings.json` の `agent` はあなたのものをオーバーライドします。
945* **2 つのプラグインが同じキーを設定**: 最後に読み込まれたプラグインからの値が適用され、`claude --debug` は `overrides setting` をログに記録します。
946
947`subagentStatusLine` の形状については、[subagent status lines](/docs/ja/statusline#subagent-status-lines) を参照してください。
948
949<h3 id="themes-and-output-styles">
950 Themes and output styles
951</h3>
952
953プラグインはカラーテーマと出力スタイルを含めることができます。どちらもユーザー独自のものと同じピッカーに表示されます。どちらかについて、マニフェストキーを設定するとフォルダスキャンが置き換わります。
954
955| Component | Save as | Format | Appears in | Manifest key |
956| :----------- | :------------------------ | :---------------------------------------------------------------------------------------------- | :------------------------------------ | :-------------------- |
957| Theme | `themes/<slug>.json` | ユーザーが `~/.claude/themes/` に記述する[カスタムテーマファイル](/docs/ja/terminal-config#create-a-custom-theme)形式 | `/theme`、ファイルの `name` の下 | `experimental.themes` |
958| Output style | `output-styles/<name>.md` | [カスタム出力スタイル](/docs/ja/output-styles#create-a-custom-output-style)形式、`name` と `description` フロントマター付き | `/output-style`、`<plugin>:<name>` として | `outputStyles` |
959
960プラグインテーマは読み取り専用であるため、ユーザーが `/theme` で 1 つを編集すると、編集は独自のテーマディレクトリにコピーとして保存されます。
961
962このテーマは、ダークプリセットのプロンプトアクセントとエラーテキストを再色付けします。
963
964```json themes/dracula.json theme={null}
965{
966 "name": "Dracula",
967 "base": "dark",
968 "overrides": {
969 "claude": "#bd93f9",
970 "error": "#ff5555"
971 }
972}
973```
974
975<h3 id="channels">
976 Channels
977</h3>
978
979[チャネル](/docs/ja/channels)により、チャットアプリなどの外部システムがメッセージをセッションに送信できます。プラグインでは、チャネルは MCP サーバーの 1 つと、それにバインドし、独自の構成を求めることができる `channels` エントリです。このマニフェストはチャネルを `telegram` サーバーにバインドし、ボットトークンを要求します。
980
981```json .claude-plugin/plugin.json theme={null}
982{
983 "name": "my-plugin",
984 "mcpServers": {
985 "telegram": {
986 "command": "node",
987 "args": ["${CLAUDE_PLUGIN_ROOT}/server.js"],
988 "env": { "BOT_TOKEN": "${user_config.bot_token}" }
989 }
990 },
991 "channels": [
992 {
993 "server": "telegram",
994 "userConfig": {
995 "bot_token": {
996 "type": "string",
997 "title": "Bot token",
998 "description": "Telegram bot token",
999 "sensitive": true
1000 }
1001 }
1002 }
1003 ]
1004}
1005```
1006
1007`server` は `mcpServers` のキーと一致する必要があります。チャネルごとの `userConfig` は、[トップレベルの `userConfig` キー](#user-configuration)と同じ形を取ります。
1008
1009サーバーが実装する必要があるもの、およびユーザーがチャネルプラグインを有効にする方法については、チャネルリファレンスの[プラグインとしてパッケージ化する](/docs/ja/channels-reference#package-as-a-plugin)を参照してください。フィールドテーブルについては、[`channels`](/docs/ja/plugins/manifest-reference#channels) を参照してください。
1010
1011<h3 id="monitors">
1012 Monitors
1013</h3>
1014
1015モニターは、セッション全体でバックグラウンドで実行されるシェルコマンドです。それが出力するものは Claude に通知として到達するため、Claude は見るよう求められることなく、ログまたはステータス変更に反応できます。エントリを `monitors/monitors.json` に保存します。
1016
1017```json monitors/monitors.json theme={null}
1018[
1019 {
1020 "name": "error-log",
1021 "command": "tail -F ./logs/error.log",
1022 "description": "Application error log"
1023 }
1024]
1025```
1026
1027コマンドはシェルで実行され、セッションが開始された作業ディレクトリで実行されます。
1028
1029モニターのコマンドは、開始場所と参照できるものに制限があります。
1030
1031* **対話型セッションのみ**: プラグインモニターは対話型セッションで開始され、`-p` フラグを使用した非対話型モードでは開始されません。また、[Monitor ツール](/docs/ja/tools-reference#monitor-tool)が利用可能な場所でのみ開始されます。
1032* **ユーザー設定なし**: `command` は[パス変数](#path-variables-and-persistent-data)と環境からの `${ENV_VAR}` を取得しますが、`${user_config.*}` は取得しません。1 つを参照するモニターは開始されず、モニタープロセスは `CLAUDE_PLUGIN_OPTION_<KEY>` も受け取りません。
1033* **セッション中の無効化**: セッション中にプラグインを無効にする場合、Claude Code は既に実行されているモニターを停止しません。セッションが終了するときに停止します。
1034
1035`experimental.monitors` マニフェストキーは同じ配列をインラインで、または JSON ファイルへのパスとして取り、`monitors/monitors.json` の代わりに読み取られます。
1036
1037`when` トリガーおよび他のフィールドについては、[`monitors`](/docs/ja/plugins/manifest-reference#monitors) を参照してください。
1038
1039<h2 id="user-configuration">
1040 ユーザーに設定値を求める
1041</h2>
1042
1043プラグインが必要とする値を `userConfig` マニフェストキーで宣言すると、ユーザーが `settings.json` を自分で編集する必要がなくなります。各オプションはダイアログに表示され、その `title` がラベルとして、その `description` がその下に表示されます。
1044
1045トークンまたはパスワードの場合は `"sensitive": true` を設定してください。ダイアログは入力をマスクし、値は `settings.json` ではなくセキュアストレージに保存されます。
1046
1047このマニフェストはエンドポイントとトークンを求めます。
1048
1049```json .claude-plugin/plugin.json theme={null}
1050{
1051 "name": "my-plugin",
1052 "userConfig": {
1053 "api_url": {
1054 "type": "string",
1055 "title": "API URL",
1056 "description": "Base URL of your team's API"
1057 },
1058 "api_token": {
1059 "type": "string",
1060 "title": "API token",
1061 "description": "Token for your team's API",
1062 "sensitive": true
1063 }
1064 }
1065}
1066```
1067
1068<h3 id="when-the-configuration-dialog-appears">
1069 設定ダイアログが表示されるとき
1070</h3>
1071
1072ダイアログは対話型の `/plugin` インターフェースにのみ表示されます。ユーザーが以下のいずれかを実行したときに、まだ設定されていないオプションに対して開きます。
1073
1074* `/plugin` でプラグインをインストールする
1075* セッション内で `/plugin install <plugin>@<marketplace>` を実行する
1076* `/plugin` の **Installed** タブからプラグインを有効にする
1077
1078ユーザーがいつでも同じダイアログを開くには、`/plugin configure <plugin>@<marketplace>` を実行します。
1079
1080`claude plugin install` シェルコマンドは `userConfig` 値のプロンプトを表示しません。シェルから値を設定するには、各値を `--config KEY=VALUE` として渡します。オプションが設定されていない場合、コマンドは `userConfig options not yet set` という行を出力し、それらを設定する両方の方法を示します。[`userConfig` ダイアログが表示されない](/docs/ja/plugins/troubleshooting#the-userconfig-dialog-never-appears)場合、その行が引用されます。
1081
1082オプションフィールド、各値が保存される場所、コンポーネントが保存された値を参照する方法、および `${user_config.*}` を拒否するフィールドについては、[ユーザー設定](/docs/ja/plugins/manifest-reference#user-configuration)を参照してください。
1083
1084<h2 id="path-variables-and-persistent-data">
1085 プラグインパスを参照し、データを保存する
1086</h2>
1087
1088プラグインがどこにインストールされるかわからないため、固定パスではなく、これらの変数を通じてそのファイルとデータを参照します。スキル、コマンド、エージェントコンテンツ、フックおよびモニターコマンド、MCP および LSP サーバー構成で置換されます。また、フック、MCP、および LSP プロセスにエクスポートされます:
1089
1090* **`${CLAUDE_PLUGIN_ROOT}`**:プラグインのインストールディレクトリ。各バージョンは独自の[キャッシュディレクトリ](/docs/ja/plugins/loading#find-plugins-on-disk)を持つため、プラグインが更新されるとパスが変更されます。そこに状態を書き込まないでください
1091* **`${CLAUDE_PLUGIN_DATA}`**:更新を生き残るディレクトリ。`node_modules`、仮想環境、キャッシュ用。`~/.claude/plugins/data/<id>/` に解決され、最初に参照されるときに作成されます
1092* **`${CLAUDE_PROJECT_DIR}`**:プロジェクトルート。フックが受け取るのと同じ値
1093
1094データディレクトリパスでは、`<id>` はプラグイン識別子で、文字、数字、`_`、`-` 以外のすべての文字が `-` に置き換わるため、`my-plugin@my-marketplace` は `my-plugin-my-marketplace` になります。
1095
1096Windows では、置換されたパスはシェルがバックスラッシュをエスケープとして読み込まないように前方スラッシュを使用します。
1097
1098<h3 id="install-dependencies-into-the-data-directory">
1099 データディレクトリに依存関係をインストールする
1100</h3>
1101
1102マーケットプレイスでインストールされたプラグインの場合、Claude Code はプラグインをキャッシュするときに適格な[Node.js パッケージ依存関係](/docs/ja/plugins/loading#node-js-package-dependencies)を自動的にインストールするため、自分でインストールする必要がない場合があります。インストールする場合、この `SessionStart` フックは最初の実行時に `${CLAUDE_PLUGIN_DATA}` に `node_modules` をインストールし、更新が `package.json` を変更した後に再度インストールします:
1103
1104```json hooks/hooks.json theme={null}
1105{
1106 "hooks": {
1107 "SessionStart": [
1108 {
1109 "hooks": [
1110 {
1111 "type": "command",
1112 "command": "diff -q \"${CLAUDE_PLUGIN_ROOT}/package.json\" \"${CLAUDE_PLUGIN_DATA}/package.json\" >/dev/null 2>&1 || (cd \"${CLAUDE_PLUGIN_DATA}\" && cp \"${CLAUDE_PLUGIN_ROOT}/package.json\" . && npm install) || rm -f \"${CLAUDE_PLUGIN_DATA}/package.json\""
1113 }
1114 ]
1115 }
1116 ]
1117 }
1118}
1119```
1120
1121最初のセッションの後、`~/.claude/plugins/data/<id>/node_modules` が存在します。MCP サーバーは `NODE_PATH` を `${CLAUDE_PLUGIN_DATA}/node_modules` に設定できます。どのフィールドがどの変数を置換するかについては、[環境変数](/docs/ja/plugins/manifest-reference#environment-variables)を参照してください。
1122
1123<h2 id="next-steps">
1124 次のステップ
1125</h2>
1126
1127* [プラグインマニフェストリファレンス](/docs/ja/plugins/manifest-reference):`plugin.json` フィールド、パスルール、標準レイアウト
1128* [evals でプラグインをテストする](/docs/ja/plugin-evals):追加したコンポーネントが Claude の動作を意図した方法で変更することを確認します
1129* [プラグインを公開および配布する](/docs/ja/plugins/publish):プラグインをバージョン管理し、マーケットプレイスに配置します
1130* [プラグインのトラブルシューティング](/docs/ja/plugins/troubleshooting):コンポーネントが読み込まれない場合またはフックが発火しない場合の対処方法