カテゴリー / MCP・スキル・プラグイン

Claude Code pluginの作り方|最小構成の作成から検証と読込まで

この記事の目次

Claude Code pluginの作り方は、空のフォルダに .claude-plugin/plugin.json(manifest)とskill 1つを置き、claude plugin validate で検証してから claude --plugin-dir で読み込む、という流れです。マーケットプレイスへの登録は要りません。最初の1手は mkdir -p my-first-plugin/.claude-plugin で、ファイルを置いたあと claude plugin validate ./my-first-plugin が ✔ Validation passed を表示すれば検証は通過です。続けて claude --plugin-dir ./my-first-plugin で起動し、/my-first-plugin:hello を打つとClaudeが挨拶を返します。本記事は公式の制作ページ(Create a Claude Code plugin)の手順に沿い、検証エラーの読み方と、読み込めないときの確認順を足して整理します。

Claude Code pluginとは何で、いつ作るべきか

公式の定義では、pluginはskill、agent、hook、MCPサーバーと、それらに名前を付ける plugin.json(manifest)をまとめたディレクトリです。Claude Codeはこのディレクトリを1つの単位として読み込みます。

作るかどうかの判断基準も公式に書かれています。skillやhookは単体でも動き、~/.claude/skills/ に置いたskillは自分のマシンの全プロジェクトで使えます。単体の設定が1つのプロジェクトか自分だけの用途で足りているうちは、そのままでかまいません。pluginにするのは、次のどれかに当てはまるときです。

  • チームメンバーに同じ設定を配りたい
  • 複数のプロジェクトに入れたい
  • バージョンを付けて公開したい

pluginにすると、skillとagentの呼び名にplugin名が付きます。my-plugin の hello skillは /my-plugin:hello になり、別のpluginに同じ名前のskillがあっても衝突しません。

他人が作ったpluginを選んで入れる側の話はClaude Codeのプラグインの記事、skill単体の書き方はClaude Codeのスキルの記事で扱っています。

最小のpluginはどんなファイル構成か

最小構成は、manifestとskill 1つです。公式は「必須のコンポーネントはない」としたうえで、skill 1つを構成要素を示す最小の例として使っています。前提は、Claude Codeがインストール済みで、サインインしていることだけです。

完成時のファイル配置は次のとおりです。

場所 中身
my-first-plugin/.claude-plugin/plugin.json manifest。pluginの名前と説明
my-first-plugin/skills/hello/SKILL.md skill本体。skillごとに1ディレクトリ

注意したいのは skills/ の置き場所です。.claude-plugin/ の中に入れるのは plugin.json だけで、skills/ はその隣、pluginフォルダの直下に置きます。公式は、.claude-plugin/ の中に置いたコンポーネントは読み込まれないと明記しています。

後からagentやhookを足すときも、置き場所は決まっています。

場所 中身
agents/ subagentごとに1つのMarkdownファイル
hooks/hooks.json hookの設定
.mcp.json MCPサーバーの定義
commands/ skillの旧形式。新しいpluginでは skills/ を使う

使うディレクトリだけを足せば十分です。hookの中身の書き方はhooksの記事、MCPサーバーの設定はMCPの記事を参照してください。

plugin.jsonには何を書くか

pluginを置きたいフォルダ(例: ~/projects)でターミナルを開き、pluginのディレクトリとmanifest用のフォルダを作ります。

mkdir -p my-first-plugin/.claude-plugin

次に my-first-plugin/.claude-plugin/plugin.json を保存します。公式の例は次の内容です。

{
  "name": "my-first-plugin",
  "description": "A greeting plugin to learn the basics",
  "version": "1.0.0",
  "author": {
    "name": "Your Name"
  }
}

4つの項目の役割は次のとおりです。

項目 必須か 役割
name 必須 pluginの識別子。すべてのskillとagentの接頭辞になる
description 任意 /plugin の画面で利用者に見える説明
version 任意 設定すると、変更するまで利用者がその版に留まる
author 任意 作者。中に入れる場合 name は必須、email と url は任意

manifestリファレンスでは、必須のキーは name だけです。

nameで気をつけること

name は空にできず、空白、@、:、パス区切り文字などは使えません。公式はkebab-caseを使うよう求めています。

もう1つの注意は予約名です。claude-、anthropic-、anthropics-、cc-plugin- で始まる名前は、Anthropic自身のpluginと紛らわしいとして検証でエラーになります。mcp-for-claude のように claude を単語として含むだけの名前は警告です。自作pluginには、用途を表す名前を付けます。

なお、manifest自体は省略もできます。その場合、--plugin-dir で読み込むとディレクトリ名がplugin名になります。名前を自分で決められるので、最初から書いておく方が扱いやすくなります。

最初のskillはどう書くか

skillは skills/ の下にディレクトリを1つ作り、その中に SKILL.md を置きます。

mkdir -p my-first-plugin/skills/hello

my-first-plugin/skills/hello/SKILL.md の公式の例です。

---
name: hello
description: Greet the user with a friendly message
disable-model-invocation: true
---

Greet the user warmly and ask how you can help them today.

--- で囲んだ部分がfrontmatterです。disable-model-invocation: true は「Claudeが自分の判断ではこのskillを実行しない」という指定です。このskillは、利用者が /my-first-plugin:hello と打って実行します。Claudeに状況を見て自分から使わせたいskillでは、この行を消します。

この1行は、作った後の「Claudeが自分から使ってくれない」という症状の原因にもなります。後の切り分けの節で扱います。

作ったpluginはどう検証し、どう読み込むか

1. validateで構造を検証する

起動する前に、manifestとskillのfrontmatterの構造検証を行います。

claude plugin validate ./my-first-plugin

成功すると、検証したmanifestのパスと ✔ Validation passed が表示されます。失敗すると ✘ Validation failed が出て、その上の各行に直すべき項目が示されます。警告も失敗として扱いたい場合は --strict を付けます。

2. –plugin-dirで読み込んで呼び出す

検証が通ったら、pluginを読み込んでClaude Codeを起動します。

claude --plugin-dir ./my-first-plugin

起動後、skillを呼び出します。

/my-first-plugin:hello

公式の期待結果は「Claudeが挨拶を返す」です。

--plugin-dir で読み込んだpluginは、そのセッションの間だけ有効で、設定ファイルには何も書き込まれません。セッション中にファイルを編集したら /reload-plugins で反映します。--plugin-dir は繰り返し指定でき、複数のpluginや .zip にまとめたpluginも同時に読み込めます。

毎回フラグを付けたくないとき

毎セッション自動で読み込ませたい場合は claude plugin init を使います。

claude plugin init my-tool

このコマンドは ~/.claude/skills/my-tool/ に .claude-plugin/plugin.json とルートの SKILL.md を作ります。~/.claude/skills/ 配下で .claude-plugin/plugin.json を持つフォルダは、フラグもインストールもなしで毎セッション読み込まれます。

呼び名には注意が要ります。ルートの SKILL.md は個人skillとしても扱われるため /my-tool で呼び、skills/ 配下に足したskillは /my-tool:example のように接頭辞付きになります。--with skills を付けると、skills/ 配下のskillも最初から作られます。読み込みを止めるには、claude plugin disable my-tool@skills-dir を実行するか、ディレクトリを消します。ディレクトリを消すとそのpluginのファイルもなくなるので、残したい場合は disable を使います。

リポジトリの全員に読み込ませたい場合は、<project>/.claude/skills/<name>/ に .claude-plugin/plugin.json を含む同じ構成を自分で作ります。

読み込めない・skillが出ないときは何を確認するか

公式は、変更が反映されないときに次の4つを順番に確認するよう案内しています。どこで止まったかが分かるので、上から1つずつ進めます。

順 どこで 何をする 分かること
1 シェル claude plugin validate <path> manifestと全skillのfrontmatterの検査。成功時は終了コード0
2 セッション内 /reload-plugins の後、/plugin名:skill名 を打つ 編集が反映され、skillが読み込まれたか。Reloaded: 行に件数が出る
3 セッション内 /plugin を開く Installedタブで見つかったコンポーネント、Errorsタブで読込失敗の理由
4 シェル claude plugin list 読込状態(Status: ✔ loaded か読込エラー)。開発中のpluginは plugin list の前に --plugin-dir とパスを付ける

validateのエラー文と直し方

claude plugin validate が失敗すると Found N errors と Validation failed が出て、終了コード1で終わります。代表的なメッセージを、公式のトラブルシューティングから抜き出しました。

メッセージ 原因 直し方
File not found: <path> 指定したパスにmanifestがない、またはパスが存在しない .claude-plugin/ を含むpluginのルートを指定し直す
Invalid JSON syntax: <parse error> manifestか hooks/hooks.json がJSONとして不正 JSONの記法を直す
YAML frontmatter failed to parse: <error> skillなどのfrontmatterが壊れている --- で囲んだfrontmatterを修正する
No frontmatter block found(警告) skillなどのfrontmatterが無い。警告なので、--strict を付けたときだけ検証が止まる --- で囲んだfrontmatterを追加する
Plugin name "<name>" is reserved: ... name が予約名に当たる 用途を表す名前に変える

直すたびにコマンドを再実行し、エラーがなくなるまで繰り返します。kebab-caseでない name や、version・description・author の欠落は、エラーではなく Validation passed with warnings として報告されます。

症状別の原因

症状 原因 直し方
pluginは読み込まれるがskillが出ない skills/ が .claude-plugin/ の中にある、またはmanifestの skills が SKILL.md ファイルを指している skills/ をpluginのルートへ移し、skills にはSKILL.mdを含むディレクトリを指定して /reload-plugins
エラーなしで何も読み込まれない --plugin-dir にマーケットプレイスのルートを渡している pluginのルート(.claude-plugin/plugin.json と skills/ などを含むフォルダ)を指定する
Errorsタブに <component> path not found: <path> manifest内のパスが存在しない場所を指している パスを直すかディレクトリを作り、/reload-plugins
/ で打てば動くが、Claudeが自分から使わない disable-model-invocation: true が残っている、descriptionが頼み方と合っていない、skillが多くdescriptionが切り詰められている 自分から使わせたいならその行を消し、descriptionを見直す

manifestにパスを書く場合は、pluginのルートからの相対パスで ./ から始めます。

最後の症状に関わる点として、公式は「エラーなく読み込めても、意図どおりにClaudeの挙動を変えられるとは限らない」としています。pluginあり・なしで同じテストを走らせて差を採点する claude plugin eval があり、詳細はTest plugins with evalsにあります。Claude Code本体のエラー表示に困っている場合はエラー対処の記事の方が近い内容です。

既存の.claude/の設定をpluginにするには

すでにプロジェクトの .claude/ にskillやagent、hookがある場合は、書き直さずにpluginへ移せます。.claude/ があるプロジェクトのルートで作業します。

  1. my-plugin/.claude-plugin/plugin.json を作る(上の手順と同じ)
  2. 持っているディレクトリだけをpluginのルートへコピーする
cp -r .claude/skills my-plugin/

agents や commands も同じ形でコピーします。

  1. hookは、.claude/settings.json か .claude/settings.local.json にある hooks オブジェクトを my-plugin/hooks/hooks.json にコピーする。形式は同じです
  2. claude --plugin-dir ./my-plugin で読み込み、新しい名前で確認する。/deploy だったskillは /my-plugin:deploy になります

注意点は、元のファイルが残っている間の挙動です。skillとagentは接頭辞が付くので両方が並んで動きますが、hookには接頭辞がないため、settingsと hooks/hooks.json の両方にあるhookはイベントのたびに2回走ります。元ファイルを消すと、.claude/ に置いていたskill・agentとsettingsの hooks は元の場所から失われます。消す前に、ls -a my-plugin でコピーした各ディレクトリが .claude-plugin の隣にあることと、--plugin-dir で読み込んだpluginが動くことを確かめます。確かめたら、.claude/ の元ファイルとsettingsの hooks を消します。

作ったpluginを他の人に渡すには

作ったpluginは、そのままでは自分のマシンにしかありません。公式が挙げる渡し方は3つです。

  • ディレクトリか .zip を直接渡す(公開作業は不要)
  • 自分のマーケットプレイスに載せ、チームに名前でインストールしてもらう
  • Anthropicのディレクトリに申請する

手順は公式のPublish and distribute a pluginにまとまっています。配る前に知っておきたい点として、有効になったpluginは使わないセッションでも、Claudeが自分で呼べるskillの名前と説明を毎ターンのコンテキストに載せます。

本記事のコマンドとメッセージは、2026年10月19日に公式ドキュメント(plugin制作・トラブルシューティング・manifestリファレンス・概要)と照合した記述です。版によって項目やメッセージが変わることがあるため、食い違う場合は公式の記述を優先してください。