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