本文へ移動
Claude Tips

プラグインのリファレンス

plugin.json と marketplace.json の全フィールド、claude plugin の全コマンドとフラグ、読み込みの規則、エラーの対処を表にまとめます。

プラグインを作る・配る・調べるときに、フィールド名やコマンドを引くためのページです。作り方はプラグインを作って配る、使う側の手順はプラグインを使うにあります。表のあとに、読み込みの規則と、エラーメッセージごとの対処をまとめています。

このページで分かること#

  • plugin.json(マニフェスト)の全フィールドとパスの書き方、userConfig・channels、環境変数、標準の配置
  • marketplace.json の全フィールド、プラグインの取得元とマーケットプレイスの取得元、検証メッセージ
  • claude plugin の全サブコマンドとフラグ、/plugin と /reload-plugins
  • 読み込みの規則(ID の読み方、スコープの優先順位、ディスク上の場所、版の計算、名前の衝突)
  • エラーメッセージの索引

マニフェスト(plugin.json)#

マニフェストは、プラグインの .claude-plugin/ に置く plugin.json で、メタデータと、ユーザーに尋ねる userConfig の値を持ちます。標準の場所の外にあるコンポーネントや、インラインで定義するコンポーネントもここで宣言します。

  • マニフェストは省略できます。無ければ、標準の配置から見つかるコンポーネントを読み込み、プラグイン名はマーケットプレイスの項目から(--plugin-dir で読み込むときはディレクトリ名から)取られます
  • メタデータ、標準の場所の外のコンポーネント、userConfig、インラインのコンポーネント定義が要るときに書きます
  • .claude-plugin/plugin.json に置き、他のファイル(skills/・commands/・hooks/ など)は .claude-plugin/ の中ではなくプラグインのルートに置きます

書き方の例#

json
{
  "name": "deploy-tools",
  "displayName": "Deploy Tools",
  "version": "1.2.0",
  "description": "Deployment commands, a review agent, and a status monitor",
  "author": {
    "name": "Example Team",
    "email": "dev@example.com",
    "url": "https://example.com"
  },
  "homepage": "https://example.com/docs/deploy-tools",
  "repository": "https://github.com/example/deploy-tools",
  "license": "MIT",
  "keywords": ["deployment", "ci"],
  "defaultEnabled": true,
  "dependencies": ["secrets-vault"],
  "metadata": { "catalogId": "cat-123" },
  "skills": ["./extra-skills/"],
  "commands": {
    "status": {
      "source": "./commands/status.md",
      "description": "Show the current deployment status"
    },
    "about": {
      "content": "Explain what the deploy-tools plugin provides.",
      "description": "Describe this plugin"
    }
  },
  "agents": ["./agents/reviewer.md"],
  "hooks": "./config/extra-hooks.json",
  "mcpServers": {
    "deploy-api": {
      "command": "node",
      "args": ["${CLAUDE_PLUGIN_ROOT}/server.js"]
    }
  },
  "lspServers": "./.lsp.json",
  "outputStyles": "./styles/",
  "experimental": {
    "themes": "./themes/",
    "monitors": "./config/monitors.json"
  },
  "userConfig": {
    "api_token": {
      "type": "string",
      "title": "API token",
      "description": "Token for the deployment API",
      "sensitive": true
    }
  }
}

未知のトップレベルのキーは取り除かれ、プラグインは読み込まれます(claude plugin validate は警告として報告します)。一方、userConfig のオプション・channels の項目・lspServers の設定・monitors の項目は厳格なオブジェクトで、中の未知のキーはエラーになり、プラグインは読み込まれません。

検証する#

claude plugin validate が、マニフェストの権威ある確認です。プラグインのディレクトリに対してシェルで実行します。

bash
claude plugin validate ./my-plugin
結果 意味
Validation passed マニフェストは読み込める
Validation passed with warnings 読み込めるが直す点がある(Claude Code が取り除く未知のトップレベルのフィールド、kebab-case でない name、version・description・author の欠けなど)。CI では --strict で警告も失敗にできる
Validation failed 型の不一致、存在しないかプラグインのルートの外に出るパス、userConfig・channels・lspServers・monitors の中の未知のキー。読み込み時にも同じ問題が報告される

.mcp.json、mcpServers が名指す .json ファイル、plugin.json の中のインラインで宣言した各 MCP サーバーの項目も検査されます(v2.1.281 以降)。エラーは、読み込み時に捨てられる項目、マニフェストが宣言していないオプションへの ${user_config.KEY} の参照、有効な絶対 URL でないリモートの url です。警告は、ループバックでないホストへの http:// か ws:// の URL、資格情報そのままに見えるヘッダーの値です。

フィールド#

トップレベルのキーは次のとおりです。必須は name だけです。

フィールド 型 内容
$schema 文字列 エディタの補完用の JSON Schema の URL。読み込み時は無視される
name 文字列 必須。プラグインの識別子。kebab-case を使う。すべてのコンポーネントがこの名前の下に置かれる
displayName 文字列 UI で name の代わりに出る名前
version 文字列 版の文字列。設定すると、変えるまでユーザーはその版にとどまる
description 文字列 プラグインが提供するものの短い説明
author オブジェクト 必須の name と、任意の email・url
homepage 文字列 ドキュメントの URL。URL として解釈できないと、プラグインが読み込まれない
repository 文字列 ソースのリポジトリの URL。検証されない
license 文字列 MIT や Apache-2.0 のような SPDX の識別子
keywords 文字列の配列 探すときのタグ
metadata オブジェクト 自分用のデータを入れる自由形式のオブジェクト。Claude Code は読まない(v2.1.222 以降)
icon 文字列 Anthropic のディレクトリでのプラグインの掲載に使うアイコン。Claude Code は読まない
documentationUrl 文字列 Anthropic のディレクトリの掲載に使うドキュメントのリンク。Claude Code は読まない
supportUrl 文字列 Anthropic のディレクトリの掲載に使うサポートのリンク。Claude Code は読まない
privacyPolicyUrl 文字列 Anthropic のディレクトリの掲載に使うプライバシーポリシーのリンク。Claude Code は読まない
termsOfServiceUrl 文字列 Anthropic のディレクトリの掲載に使う利用規約のリンク。Claude Code は読まない
defaultEnabled 真偽値 ユーザーが設定していないとき、有効で始めるか。既定は true
dependencies 文字列かオブジェクトの配列 このプラグインが動くために有効でなければならないプラグイン
settings オブジェクト プラグインが有効なあいだ適用する設定。agent と subagentStatusLine だけが効く
userConfig オブジェクト プラグインを有効にするとき、ユーザーに尋ねる値
types パス Mod の $.state の値と $ の名詞を宣言する .d.ts ファイル
channels オブジェクトの配列 プラグインが提供するメッセージのチャネル。それぞれ、プラグインの MCP サーバーの1つに結び付く
skills パス、またはパスの配列 スキルを探すディレクトリ。<name>/SKILL.md のフォルダを含むディレクトリか、SKILL.md を直接持つ1つのフォルダ。"." はプラグインのルート。既定の skills/ の走査に足される
commands パス、パスの配列、オブジェクト 平らな .md のコマンドファイルかそのディレクトリ、またはコマンド名を source か content に対応づけるオブジェクト。既定の commands/ の走査を置き換える
agents パス、またはパスの配列 エージェントの .md ファイル。ディレクトリは不可。既定の agents/ の走査を置き換える
hooks パス、オブジェクト、またはその配列 .json のフックファイルかインラインのフック設定。hooks/hooks.json と一緒に読み込まれる
mcpServers パス、オブジェクト、またはその配列 .json の MCP 設定ファイル、.mcpb か .dxt のバンドル、名前をキーにしたインラインのサーバー設定。.mcp.json と一緒に読み込まれ、あとで宣言した同名のサーバーが前のものを置き換える
lspServers パス、オブジェクト、またはその配列 .json の LSP 設定ファイルか、名前をキーにしたインラインのサーバー設定。.lsp.json と一緒に読み込まれる
outputStyles パス、またはパスの配列 出力スタイルのファイルかディレクトリ。既定の output-styles/ の走査を置き換える
workflows パス、またはパスの配列 ワークフローの .js ファイルかディレクトリ。既定の workflows/ の走査を置き換える(ワークフロー)
experimental オブジェクト themes・monitors・evals の入れ物。マニフェスト上の形が変わる可能性がある
experimental.themes パス、またはパスの配列 テーマのファイルかディレクトリ。既定の themes/ の走査を置き換える。トップレベルの themes キーも読み込まれるが、claude plugin validate が警告する
experimental.monitors パス、またはインラインの配列 モニターの配列を持つ .json ファイル、または配列そのもの。既定は monitors/monitors.json。トップレベルの monitors キーも読み込まれるが、claude plugin validate が警告する。モニターは対話セッションでだけ動き、Amazon Bedrock・Google Cloud の Agent Platform・Microsoft Foundry では動かない
experimental.evals パス、またはパスの配列 既定の evals/ でないときの、プラグインの eval ケースのディレクトリ。claude plugin eval --eval-dir が上書きする(プラグインの評価(evals))

型の欄の「パス」は、"./custom/commands" のようにプラグインのルートからの相対の文字列です。

  • name:空でなく、空白・@・:・パスの区切り・制御文字・双方向の書式文字を含まない。kebab-case を使う。Claude Code がすべてのコンポーネントをこの下に置くので、プラグイン deploy-tools のエージェント reviewer は deploy-tools:reviewer と出る

claude plugin validate は、名前が Anthropic 自身のプラグインに見えないかも検査します。大文字小文字は無視し、区切りの連続は1つとして扱います。

名前 結果
claude-・anthropic-・anthropics-・cc-plugin- で始まる エラー
claude・anthropic・anthropics・claude-code・claude-mods のどれか エラー
official を claude か anthropic の隣に置く(official-claude-tools など) エラー
claude・anthropic・anthropics を、ほかの位置で単語として含む(mcp-for-claude など) 警告

エラーは Plugin name "<name>" is reserved: it passes as one of Anthropic's own、警告は Plugin name "<name>" reads as one of Anthropic's own と出ます。claude plugin init と claude plugin tag は、エラーになる名前を拒みます。名前を検査するのはこれらのコマンドだけで、拒まれる名前のプラグインでも、Claude Code はインストールして読み込みます。

  • displayName:空白や任意の大文字小文字を含められ、名前空間や検索には使われない。マーケットプレイスから入れたプラグインでは、マーケットプレイスの項目の displayName が優先される
  • version:semver として検査されない。設定すると、変えるまでその版に固定される。command の取得元のプラグイン、claude.ai がホストするマーケットプレイスのプラグイン、ローカルのパスから追加したマーケットプレイスからその場で読み込むプラグインは、このフィールドに固定されない
  • defaultEnabled:ユーザーが enabledPlugins で設定していないときに有効で始めるか。既定は true。有効なプラグインが依存するプラグインは、この値にかかわらず有効で始まる。マーケットプレイスの項目の同じフィールドが、これを上書きする。ユーザーの enabledPlugins の項目は一度書かれると、更新をまたいで残るので、あとのリリースで defaultEnabled を変えても、既存のユーザーの設定は変わらない
  • dependencies:各項目は "name"、"name@marketplace"、または { "name": "...", "marketplace": "...", "version": "..." }。名前だけのものは、このプラグイン自身のマーケットプレイスで解決される(プラグインを作って配る)
  • settings:agent と subagentStatusLine だけが効き、他のキーは読み込み時に捨てられる。プラグインのルートの settings.json が、このキーに優先する

ディレクトリ掲載用のフィールド#

Anthropic のディレクトリは、プラグインを申請すると、plugin.json の icon・documentationUrl・supportUrl・privacyPolicyUrl・termsOfServiceUrl を掲載に使います。Claude Code は読み込み時にこれらを無視します。書くのは plugin.json だけにします。マーケットプレイスの項目に書くと、claude plugin validate が、それぞれを未知のフィールドとして報告します。

icon にはプラグインの中の画像ファイルのパス(./logo.png など)を、4つの URL のフィールドには https:// の URL を書きます。

claude plugin validate は、Claude Code v2.1.281 以降でこれらのフィールドを警告なしで受け付けます。それより前の版は、それぞれに Unknown field の警告を出すので、--strict の実行はその版で失敗します。

コンポーネントのパスの形#

どのコンポーネントのキーも、プラグインのルートからの相対パスを受けます。hooks・mcpServers・lspServers・experimental.monitors はインラインの設定も、commands はオブジェクトの対応づけも、mcpServers は MCP バンドルのパスと URL も受けます。

agents・skills・outputStyles・workflows・experimental.themes は、1つのパスかパスの配列を取ります。agents の項目は .md ファイル、skills の項目はディレクトリで、残りの3つはディレクトリかファイルです。

json
{
  "agents": ["./custom-agents/reviewer.md", "./custom-agents/tester.md"],
  "skills": ["./extra-skills/", "."],
  "outputStyles": "./styles/"
}

commands#

commands は、パス、パスの配列、またはオブジェクトの対応づけを取ります。パスは平らな .md のコマンドファイルかディレクトリです。対応づけでは、各キーがプラグインの接頭辞のあとのコマンド名になります(プラグイン deploy-tools の "about" は /deploy-tools:about で動く)。各値は source か content のちょうど1つを設定し、両方か両方なしの項目は検証に失敗します。

フィールド 型 内容
source 文字列 コマンドの Markdown ファイルへの、プラグインのルートからのパス
content 文字列 source の代わりに、コマンド本文のインラインの Markdown
description 文字列 コマンドに出る説明
argumentHint 文字列 コマンド名のあとに出る引数のヒント([file] など)
model 文字列 コマンドの既定のモデル
allowedTools 文字列の配列 プロンプトなしで使ってよいツール
json
{
  "commands": {
    "status": { "source": "./commands/status.md", "argumentHint": "[env]" },
    "about": { "content": "Explain what this plugin provides." }
  }
}

hooks#

hooks は、.json ファイルのパス、settings.json の hooks と同じ形のインラインのフックオブジェクト、または両方を混ぜた配列を取ります(イベントとハンドラのフィールドはフックのリファレンス)。フックのファイルは、イベントの対応づけを、最上位の "hooks" キーで包みます(hooks/hooks.json と同じ形)。包みのない、イベントの対応づけだけのファイルは、読み込みに失敗します。インラインのオブジェクトは、包みのない、イベントの対応づけそのものです。

宣言したものは、hooks/hooks.json があればそれとマージされます。次の配列は、フックのファイルを1つ読み込み、インラインの PostToolUse のフックを1つ宣言します。

json
{
  "hooks": [
    "./config/extra-hooks.json",
    {
      "PostToolUse": [
        {
          "matcher": "Write|Edit",
          "hooks": [
            { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/format.sh" }
          ]
        }
      ]
    }
  ]
}

その配列が指すファイルは、自分のイベントの対応づけを "hooks" で包みます。

json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          { "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/check-command.sh" }
        ]
      }
    ]
  }
}

mcpServers#

mcpServers は、.json ファイルのパス、MCP バンドルのパスか URL、インラインの対応づけ、またはそれらを混ぜた配列を取ります。サーバー設定のフィールドはMCP サーバーをつなぐにあります。Claude Code は、プラグインのルートの .mcp.json を先に読み、宣言した各形を順に読みます。あとで宣言した同名のサーバーが、前のものを置き換えます。

形 値の例 Claude Code の動作
.json ファイルのパス "./mcp/servers.json" ファイルを mcpServers の対応づけとして読む
MCP バンドルのパス "./bundle.mcpb" .mcpb か .dxt のバンドルをプラグインのルートの .mcpb-cache/ に展開し、サーバー設定を読む
MCP バンドルの URL "https://example.com/server.mcpb" バンドルを .mcpb-cache/ へダウンロードして読む
インラインの対応づけ { "deploy-api": { "command": "node", "args": ["${CLAUDE_PLUGIN_ROOT}/server.js"] } } 対応づけを、名前をキーにしたサーバー設定として使う

バンドルのパスか URL は .mcpb か .dxt で終わる必要があり、他の拡張子は検証に失敗します。

lspServers#

lspServers は、.json ファイルのパス、サーバー名を設定に対応づけるインラインの対応づけ、またはそのどちらかの配列を取ります。プラグインのルートの .lsp.json を先に読み、宣言した各設定を順に読みます。あとで宣言した同名のサーバーが前のものを置き換えます。各サーバー設定は厳格なオブジェクトで、未知のキーは検証に失敗します。

フィールド 必須 内容
command はい 言語サーバーのバイナリ。値が / で始まるのでなければ空白を含められない。引数は args に置く
extensionToLanguage はい ファイルの拡張子を LSP の言語 ID に対応づける。1つ以上。キーは ".go" のようにドットで始まる
args いいえ サーバーに渡す引数
transport いいえ 通信方式。stdio(既定)か socket。socket は受け付けるが、すべてのサーバーを stdio で動かすので、標準出力のプロトコルの規則がすべてのサーバーに当てはまる
env いいえ サーバーのプロセスの環境変数
initializationOptions いいえ initialize 要求で送るオプション
settings いいえ workspace/didChangeConfiguration で送る設定
workspaceFolder いいえ サーバーのワークスペースフォルダのパス
startupTimeout いいえ 起動を待つミリ秒。正の整数
shutdownTimeout いいえ 正常な終了を待つミリ秒。正の整数。経過すると Claude Code がサーバーのプロセスを終了させる。未設定ならタイムアウトなし
requestTimeout いいえ サーバーが要求に答えるのを待つミリ秒。正の整数。既定は 60000 で、答えない要求は60秒で失敗する。v2.1.288 以降
restartOnCrash いいえ クラッシュ後に再起動するか。既定は true。false にすると、クラッシュしたサーバーを止めたままにする
maxRestarts いいえ 諦めるまでの再起動の回数。0以上
diagnostics いいえ 編集のあとに診断をコンテキストへ入れるか。既定は true
json
{
  "lspServers": {
    "go": {
      "command": "gopls",
      "args": ["serve"],
      "extensionToLanguage": { ".go": "go" }
    }
  }
}

Anthropic がプラグインとして出している言語サーバーと実行時の挙動はプラグインを使うのコードインテリジェンスの節にあります。

monitors#

experimental.monitors は、.json ファイルのパスかインラインの配列を取ります。キーを省くと、あれば monitors/monitors.json が読み込まれます。各項目は、次のフィールドを持つ厳格なオブジェクトです。

フィールド 必須 内容
name はい プラグイン内で一意の識別子
command はい セッションの作業ディレクトリで、持続する背景プロセスとして Claude Code が動かすシェルコマンド
description はい タスクパネルと通知の要約に出る短い説明
when いいえ "always"(既定)ならセッション開始時とプラグインのリロード時に始まる。"on-skill-invoke:<skill>" なら、そのスキルが最初に動いたときに始まる
json
{
  "experimental": {
    "monitors": [
      {
        "name": "deploy-status",
        "command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/poll-deploy.sh",
        "description": "Deployment status changes",
        "when": "on-skill-invoke:deploy"
      }
    ]
  }
}

モニターの command は ${user_config.*} を参照できません(下の「シェルを通るフィールド」)。

パスの規則#

マニフェストのコンポーネントのパスは、プラグインのルートからの相対で、./ で始める必要があります。commands/foo.md のようなパスは検証に失敗します。skills と mcpServers には、この規則の外の形が1つずつあります。

  • skills:"." も受ける。"." と "./" はどちらもプラグインのルートを指す。v2.1.221 より前は "." が検証に失敗したので、それより前の版でも読み込ませるなら "./" を使う
  • mcpServers:https:// のバンドルの URL も受ける

どのコンポーネントのパスも、プラグインのルートの内側に解決され、存在する必要があります。claude plugin validate が、各コンポーネントのキーのパスを検査します。

  • ルートの内側であること:外へ解決されるパスは読み込まれず、/plugin の「Errors」タブに <component> path escapes plugin directory: <path> と出る。たいていは .. を含むパスで、claude plugin validate は Path contains ".." which could be a path traversal attempt というエラーを出す
  • 存在すること:存在しないパスは読み込まれず、「Errors」タブに <component> path not found: <path> と出る。claude plugin validate は Path not found を報告する
  • outputStyles・lspServers・monitors・themes のパスの検査は、v2.1.283 以降

experimental.evals はコンポーネントのパスではないので、この節の規則は当たらず、claude plugin eval が実行時に値を検査します。値は、プラグインのルートの下のディレクトリの名前("quality/evals" など。先頭の ./ はあってもなくてもよい)です。配列のときは最初の項目だけが使われます。値が受け付けるものと、使えない値のときの動きは、プラグインの評価(evals)にあります。

キーごとに、既定の場所との関係が違います。

関係 キー
既定の場所を置き換える commands・agents・outputStyles・workflows・experimental.themes・experimental.monitors
既定の場所に足す skills(skills/ も走査され、並べたディレクトリが並んで読み込まれる)
マージする hooks・mcpServers・lspServers(既定のファイルが先に読まれ、マニフェストが宣言したものがそこにマージされる)

commands を設定すると、既定の commands/ は走査されません。既定を残して足すには、"commands": ["./commands/", "./extras/"] のように明示します。commands/ のような既定のフォルダがあるのに、それを置き換えるマニフェストのキーも設定すると、マニフェストのパスだけが読み込まれ、claude plugin list と /plugin に Default <folder>/ folder is ignored because the manifest sets "<key>" という警告が出ます。警告を避けるには、そのフォルダ内のパスを指定します("commands": ["./commands/deploy.md"] は、既定のフォルダ内のファイルを指すので警告が出ません)。

userConfig#

userConfig は、プラグインを有効にするときに Claude Code がユーザーへ尋ねる値を宣言します。キーは、英数字とアンダースコアからなる識別子で、数字で始められません。各値は、次のフィールドを持つ厳格なオブジェクトで、未知のキーは検証に失敗します。

フィールド 必須 内容
type はい string・number・boolean・directory・file のどれか
title はい 設定のダイアログに出るラベル
description はい 欄の下に出るヘルプ
required いいえ true なら、設定のダイアログが空の値を受け付けない
default いいえ ユーザーが何も与えないときの値。文字列・数値・真偽値・文字列の配列
options いいえ string で、受け付ける値。/config で選択肢として出る。v2.1.271 以降
multiple いいえ string で、文字列の配列を許す
sensitive いいえ true なら入力を伏せ、値を settings.json でなく安全な保管場所に保存する
min / max いいえ number の範囲

有効な各プラグインの各オプションは、sensitive のものと multiple の一覧を除き、/config パネルにも行として出ます(v2.1.269 以降)。

json
{
  "userConfig": {
    "api_endpoint": {
      "type": "string",
      "title": "API endpoint",
      "description": "Your team's API endpoint"
    },
    "api_token": {
      "type": "string",
      "title": "API token",
      "description": "API authentication token",
      "sensitive": true
    }
  }
}

options で値を固定の一覧から選ばせられます。default は一覧の値の1つにするか、required: true にして選ばせます。

json
{
  "userConfig": {
    "tone": {
      "type": "string",
      "title": "Tone",
      "description": "Voice for generated replies",
      "options": ["neutral", "warm", "formal"],
      "default": "neutral"
    }
  }
}
  • options を宣言したフィールドが1つでもあると、v2.1.271 より前の Claude Code ではプラグインが読み込めない
  • options は、multiple でも sensitive でもない string に適用される。各選択肢は1〜64文字のただのラベルで、他は claude plugin validate が報告する。この規則に反する options のプラグインは読み込みに失敗する
  • 保存先:sensitive でない値は、ユーザーの settings.json の pluginConfigs に保存され、sensitive の値は、プラットフォームの安全な資格情報の保管場所に入る(pluginConfigs を読む設定ファイルは設定キー一覧)
  • 参照の仕方:${user_config.KEY} は、MCP サーバーの設定・LSP サーバーの設定・フックの exec 形式の args・スキルとエージェントの本文で置換される(スキルとエージェントの本文では、sensitive でない値だけが置換され、sensitive の値はプレースホルダーになる)。CLAUDE_PLUGIN_OPTION_<KEY> は、すべてのオプションについてフックのプロセスに渡される(<KEY> は大文字。api_token を、シェル形式のフックは $CLAUDE_PLUGIN_OPTION_API_TOKEN で読む)

シェルを通るフィールド#

シェル形式のフックのコマンド、モニターのコマンド、MCP の headersHelper は、${user_config.*} を拒否します。置換した値をシェルが解析し直してしまうので、これらのフィールドで参照するコンポーネントは、実行されずエラーになります。値を届ける別の方法は次のとおりです。

フィールド 値を届ける方法
シェル形式のフックのコマンド args を使う exec 形式にするか、フックの環境の CLAUDE_PLUGIN_OPTION_<KEY> を読む
モニターのコマンド Claude Code 経由では届けられない。モニターのプロセスは CLAUDE_PLUGIN_OPTION_<KEY> を受け取らないので、モニターのスクリプトが自分で値を得る
MCP の headersHelper Claude Code 経由では届けられない。ヘルパーの環境には CLAUDE_PLUGIN_ROOT・CLAUDE_CODE_MCP_SERVER_NAME・CLAUDE_CODE_MCP_SERVER_URL はあるがオプションの値は無いので、ヘルパーのスクリプトが自分で値を得る

channels#

channels は、チャットアプリへの橋渡しのような、プラグインが提供するメッセージのチャネルを宣言します。宣言すると、プラグインを有効にするときにチャネルの設定を尋ねられます(サーバーがメッセージを注入する方法はチャネル)。各項目は、プラグインの MCP サーバーの1つに結び付く厳格なオブジェクトです。

フィールド 必須 内容
server はい このプラグインの mcpServers の中の、チャネルが結び付く MCP サーバーのキー
displayName いいえ 設定のダイアログの題に出る名前。既定はサーバー名
userConfig いいえ 尋ねるオプション。トップレベルの userConfig と同じ形。保存した値が、サーバーの env の ${user_config.KEY} の参照に置換される
json
{
  "mcpServers": {
    "telegram": {
      "command": "node",
      "args": ["${CLAUDE_PLUGIN_ROOT}/server.js"],
      "env": { "BOT_TOKEN": "${user_config.bot_token}" }
    }
  },
  "channels": [
    {
      "server": "telegram",
      "displayName": "Telegram",
      "userConfig": {
        "bot_token": {
          "type": "string",
          "title": "Bot token",
          "description": "Telegram bot token",
          "sensitive": true
        }
      }
    }
  ]
}

環境変数#

Claude Code は、プラグインのコンポーネントに3つのパス変数を渡します。次の表のフィールドで ${NAME} として参照し、受け取るプロセスでは環境変数として読みます。

変数 解決先 使いどころ
${CLAUDE_PLUGIN_ROOT} インストールされた版のプラグインの絶対パス プラグインに同梱したスクリプト・バイナリ・設定ファイル
${CLAUDE_PLUGIN_DATA} ~/.claude/plugins/data/<id>/。最初の参照で作られ、プラグインの更新をまたいで残る。<id> は、プラグインの識別子の英数字・_・- 以外の文字をすべて - に置き換えたもの node_modules のようにインストールした依存、生成したコード、キャッシュ
${CLAUDE_PROJECT_DIR} プロジェクトのルート プロジェクト内のスクリプトと設定ファイル

${CLAUDE_PLUGIN_ROOT} はプラグインの更新で変わるので、そこに状態を書きません。${CLAUDE_PLUGIN_DATA} のディレクトリは、既定では、プラグインを最後のインストール先から削除するときに消えます(--keep-data などで残る場合は下の plugin uninstall)。

プラグインのコンポーネント ${...} が解決されるフィールド プロセスへ渡されるもの
フックのコマンド command と args の中のどこでも CLAUDE_PLUGIN_ROOT・CLAUDE_PLUGIN_DATA・CLAUDE_PROJECT_DIR、CLAUDE_PLUGIN_OPTION_<KEY>
モニターのコマンド command の中のどこでも 渡されない
MCP の stdio サーバー command・args・env CLAUDE_PLUGIN_ROOT・CLAUDE_PLUGIN_DATA
MCP の http・sse・ws サーバー url・headers・headersHelper 該当なし
LSP サーバー command・args・env・workspaceFolder CLAUDE_PLUGIN_ROOT・CLAUDE_PLUGIN_DATA・CLAUDE_PROJECT_DIR
スキル・コマンド・エージェントの本文 Markdown の本文のどこでも 該当なし

この変数は、メインのセッションでもサブエージェントでも、Claude が Bash ツールで動かすコマンドの環境には入っていません。スキル・コマンド・エージェントの本文では、Markdown の本文に ${...} の参照を書くと、内容を読み込むときに Claude Code がパスをその場で置換します。

置換したパスは1つの引数に保ちます。フックのコマンドは、args を使う exec 形式にすると、各パスが引用符なしで1つの引数になります。シェル形式のフックとモニターのコマンドは、変数を二重引用符で囲み、空白を含むパスを1語にします。フックのファイルのシェル形式のコマンドで、これらの変数を引用符の外に置くと、フックの shell が "powershell" でない限り、claude plugin validate が警告します。Windows では、置換したパスは、シェルがバックスラッシュをエスケープと読まないように、スラッシュを使います。

標準の配置#

マニフェストが別の場所を指さないとき、各コンポーネントの種類は、プラグインのルートの下の既定の場所を使います。

コンポーネント 既定の場所 内容
マニフェスト .claude-plugin/plugin.json プラグインのメタデータと設定。省略可
スキル skills/ スキルごとに <name>/SKILL.md。ルートに SKILL.md があり、skills/ も skills キーも無いプラグインは、1つのスキルとして読み込まれる
コマンド commands/ 平らな Markdown のコマンドファイル。新しいプラグインには skills/ を
エージェント agents/ エージェントの Markdown ファイル。サブフォルダはエージェント名の一部になる
フック hooks/hooks.json フックの設定
MCP サーバー .mcp.json MCP サーバーの定義
LSP サーバー .lsp.json LSP サーバーの設定
出力スタイル output-styles/ 出力スタイルの Markdown ファイル
ワークフロー workflows/ ワークフローの .js ファイル
テーマ themes/ テーマの JSON ファイル
モニター monitors/monitors.json モニターの配列
実行ファイル bin/ プラグインが有効なあいだ Bash ツールの PATH に入り、Claude が素のコマンドとして動かせる。このディレクトリを持つプラグインは、claude.ai の組織設定で配るものも含め、claude.ai と Cowork では入らない
設定 settings.json プラグインが有効なあいだ適用される agent と subagentStatusLine の既定
text
deploy-tools/
├── .claude-plugin/
│   └── plugin.json
├── skills/
│   └── deploy/
│       └── SKILL.md
├── commands/
│   └── status.md
├── agents/
│   └── reviewer.md
├── hooks/
│   └── hooks.json
├── monitors/
│   └── monitors.json
├── output-styles/
│   └── terse.md
├── themes/
│   └── dracula.json
├── workflows/
│   └── release-audit.js
├── bin/
│   └── deploy-tool
├── scripts/
│   └── format.sh
├── settings.json
├── .mcp.json
└── .lsp.json

プラグインのルートの CLAUDE.md はコンテキストとして読み込まれず、claude plugin validate が見つけると警告します。Claude のコンテキストに入る指示を入れるには、スキルに書きます。

マーケットプレイスの項目とマニフェスト#

マーケットプレイスの項目は、項目自身のフィールドと、ディレクトリ掲載用のフィールドを除くこのページのすべてのフィールドを、並べて受け付けます(strict を含む)。strict は、項目が、自分の plugin.json を持つプラグインにコンポーネントを足せるかを決めます。既定は true です。項目は、マニフェストとして働くか、それに足すか、衝突します。

  • plugin.json が無い:strict にかかわらず、項目がマニフェストになる。項目の hooks はインラインのオブジェクトの形でだけ読み込まれる。ファイルパスや配列だと、「Errors」タブに not yet supported in a marketplace entry というエラーが出る
  • plugin.json があり、strict が未設定か true:マニフェストを読み込み、項目の commands・agents・skills・outputStyles・themes をそれに足す。hooks は、項目のイベントごとのマッチャーが、マニフェストの同じイベントのマッチャーを置き換え、マニフェストだけが宣言するイベントはそのまま残る
  • plugin.json があり、strict: false:項目が commands・agents・skills・hooks・outputStyles・themes のどれかを宣言すると衝突で、プラグインは Plugin <name> has conflicting manifests で読み込みに失敗する

マーケットプレイスの項目のルートを source にして特定の skills サブディレクトリを並べると、そのサブディレクトリだけが読み込まれ、プラグインの既定の skills/ は走査されません(マニフェストの skills キーは、既定に足される)。メタデータの優先順位は、strict にかかわらず固定です。

  • defaultEnabled と表示用のフィールド:項目の defaultEnabled と displayName などの表示用フィールドが、マニフェストのものを上書きする
  • version:マニフェストの version が、項目の version を上書きする
  • name:項目がマニフェストと別の name でプラグインを載せているとき、enabledPlugins は項目の名前を使い、コンポーネントはマニフェストの名前の下に置かれる

マーケットプレイス(marketplace.json)#

marketplace.json は、マーケットプレイスを定義するファイルで、名前・所有者・プラグインごとの項目を持ちます。各項目のプラグインの取得元が、そのプラグインを Claude Code が取得する場所を示します。マーケットプレイスの取得元は別のオブジェクトで、marketplace.json 自体を取得する場所を示します(設定に書くか、claude plugin marketplace add が作ります)。

ファイルはマーケットプレイスのディレクトリの .claude-plugin/marketplace.json に置きます。リポジトリ内の別の場所に置くときは、ユーザーが extraKnownMarketplaces で取得元の path を指定してマーケットプレイスを宣言する必要があります(claude plugin marketplace add にはその指定がありません)。.claude-plugin/ を含むディレクトリがマーケットプレイスのルートで、相対のプラグインの取得元はすべてそこから解決されます。ユーザーは name ごとに1つのマーケットプレイスを登録するので、同じ名前の2つは同時に登録できません。未知のトップレベルのキーや項目のキーは拒否されず無視され、打ち間違いが静かに読み込まれます(claude plugin validate が各未知のキーを警告します)。

予約された名前#

マーケットプレイスに、次の名前は付けられません。

区分 名前 備考
公式 claude-code-marketplace・claude-code-plugins・claude-plugins-official・anthropic-marketplace・anthropic-plugins・agent-skills・anthropic-agent-skills・life-sciences・knowledge-work-plugins・claude-for-legal・claude-for-financial-services・financial-services-plugins・first-party-plugins・claude-tag-plugins github.com/anthropics/ の github か git の取得元でない限り予約される
コミュニティ claude-community・claude-plugins-community・healthcare 公式と同じ規則で予約される
プラグインディレクトリ anthropic-plugin-directory・claude-plugin-directory 公式と同じ規則で予約される
公式を装う名前 official-claude-plugins や claude-plugins-v2 のような名前、非 ASCII 文字を含む名前 エラーは Marketplace name impersonates an official Anthropic/Claude marketplace。制御文字や双方向の書式文字を含む名前は Marketplace name cannot contain control or bidirectional-formatting characters。そのような名前ですでに登録されたマーケットプレイスは、プラグインとともに読み込まれなくなる
予約名の別の綴り 予約名と、末尾のドットか、ハイフンの代わりにアンダースコア以外の記号を使う点だけが違う名前(claude.code.plugins は claude-code-plugins と数えられる) 追加は is another spelling of "<reserved>", a reserved marketplace name で失敗し、すでに登録されたものは読み込まれなくなる(v2.1.280 以降)
マーケットプレイス以外のプラグインの名前 inline(--plugin-dir)・builtin(組み込み)・skills-dir(.claude/skills/ から自動で読み込まれるもの)・synced(claude.ai から同期されたもの)・claude-plugin-test skills-dir は strictKnownMarketplaces と blockedMarketplaces の {"source": "skills-dir"} としても現れる
パッケージ管理などの名前 npm・pip・uv・cargo・github・gh どの大文字小文字でも予約される(v2.1.275 以降)
claudeai- で始まる名前 claude.ai がホストするマーケットプレイス用に予約 他のマーケットプレイスの追加は Cannot add marketplace "<name>": names starting with "claudeai-" are reserved for marketplaces hosted on claude.ai で拒否される

登録済みのマーケットプレイスが公式を装う名前のために読み込まれなくなると、claude plugin list と /plugin が Claude Code refuses the marketplace name "<name>" と報告し、マーケットプレイスを削除するよう案内します(削除すると、そのプラグインもアンインストールされ、保存データも消えます。この表示は v2.1.282 以降)。

トップレベルのフィールド#

marketplace.json から Claude Code が読むキーは次のとおりです。name・owner・plugins が必須です。

フィールド 型 内容
name 文字列 マーケットプレイスの識別子。英数字・.・_・- で、英字か数字で始まり、.. を含まない。他の名前は、その名前のマーケットプレイスからはプラグインをインストールできないので、claude plugin validate が失敗にする。ユーザーは、プラグインを入れるとき、my-plugin@my-marketplace のようなプラグイン ID の @ の後ろにこの名前を書く
owner オブジェクト 保守者の情報。name が必須、email と url は任意
plugins 配列 プラグインの項目。各項目は個別に検証され、不正な項目が1つあってもマーケットプレイス全体は失敗しない
$schema 文字列 エディタの補完用の JSON Schema の URL。読み込み時は無視される
description 文字列 ユーザーに出るマーケットプレイスの説明。無いと claude plugin validate が警告する
version 文字列 マーケットプレイスのマニフェストの版
metadata.description・metadata.version 文字列 description と version の別の置き場所
metadata.pluginRoot 文字列 名前だけの取得元が解決されるディレクトリ。v2.1.239 以降
forceRemoveDeletedPlugins 真偽値 true なら、plugins から外したプラグインがユーザーのマシンからアンインストールされる
allowCrossMarketplaceDependenciesOn 文字列の配列 このマーケットプレイスのプラグインの依存として入れてよい、プラグインを持つマーケットプレイスの名前。プラグインを入れるときは、そのプラグイン自身のマーケットプレイスのリストだけが、依存の連鎖全体に適用される
renames オブジェクト 以前のプラグイン名を現在の名前に、外したプラグインなら null に対応づける

プラグインの項目#

plugins 配列の各オブジェクトが、プラグインの名前と取得場所を示します。name と source が必須です。項目は、ディレクトリ掲載用のフィールドを除く plugin.json の全フィールド(description・version・author・commands・hooks など)も受け付けます。次の表は、項目自身のフィールドと、項目の中では意味が変わるマニフェストのフィールドです。

フィールド 型 内容
name 文字列 プラグインの識別子。英数字・.・_・- で、英字か数字で始まる。他の名前は claude plugin validate が失敗にし、Claude Code は入れられない。プラグイン自身の plugin.json が別の name を設定していても、ユーザーは @ の前にこれを打って入れる
source 文字列かオブジェクト プラグインを取得する場所(下の「プラグインの取得元」)
description 文字列 /plugin の一覧と詳細に出る
version 文字列 プラグインの版の文字列。plugin.json も version を設定していると plugin.json が優先し、claude plugin validate が警告する
category 文字列 カタログを整理する自由形式のカテゴリ
tags 文字列の配列 検索用の自由形式のタグ
strict 真偽値 既定は true。plugin.json がプラグインのコンポーネントの決定的な出どころか(下の「strict モード」)
relevance オブジェクト プラグインをいつ提案するかを Claude Code に伝えるシグナル(プラグインを作って配る)
dependencies 配列 このプラグインが動くために有効でなければならないプラグイン。各項目は "name"・"name@marketplace"・オブジェクト
defaultEnabled 真偽値 既定は true。ユーザーが enabledPlugins で設定していないとき、有効で始めるか。項目の値が plugin.json に優先する
displayName 文字列 UI に出る人向けの名前。項目にも plugin.json にも無ければ、ユーザーにはプラグインの name が見える
metadata オブジェクト 自分用のフィールドの自由形式のオブジェクト。Claude Code は読まない(v2.1.222 以降)
headers オブジェクト この項目の archive をダウンロードするとき Claude Code が送る HTTP ヘッダー。ここで設定したヘッダーが、マーケットプレイスの取得元の headers の同名のヘッダーを置き換える(v2.1.238 以降)
headersHelper 文字列 期限のある資格情報のために、この項目のアーカイブのダウンロードのヘッダーを1つの JSON オブジェクトとして出力するコマンド。項目に "strict": false も必要(v2.1.238 以降。プラグインを作って配る)

項目のフィールドが、自分の .claude-plugin/plugin.json を持つ取得したプラグインと、持たないものとで、どう適用されるかが違います。plugin.json が無ければ、項目がマニフェストで、項目の mcpServers・lspServers・userConfig・channels も含め、項目が受け付けるすべてのマニフェストのフィールドが適用されます。plugin.json があれば、plugin.json がマニフェストで、strict が、項目の6つのコンポーネントのフィールド(commands・agents・skills・hooks・outputStyles・themes)をそれに合成するか、衝突として拒否するかを決めます。項目の mcpServers・lspServers・userConfig・channels は適用されないので、plugin.json に宣言します。

項目の hooks は、イベント名をマッチャーの配列に対応づけるインラインのオブジェクトで書きます。ファイルパスか配列で書くと、claude plugin validate は通しますが、そのフックは動かず、Claude Code がプラグインについて not yet supported in a marketplace entry というエラーを報告します。ファイルベースのフックは、プラグイン自身の hooks/hooks.json か plugin.json に置きます。

表示用のフィールド(displayName・description・author・homepage・repository・license・keywords)は、項目と plugin.json のどちらにも設定できます。項目に設定したフィールドは、plugin.json が別の値を設定していても項目の値が、項目が未設定のものは plugin.json の値が、インストールの前後の一覧と詳細で見えます。インストールの前に Claude Code が plugin.json を読めるのは、プラグインのファイルがマーケットプレイスの中にある相対パスの取得元の項目だけです。それ以外の取得元では、インストールするまで項目自身のフィールドだけが見えます。

strict モード#

strict は、取得したプラグインが自分の plugin.json を持ち、項目もコンポーネントのフィールドのどれかを宣言しているときの動作を決めます。

strict plugin.json 項目のコンポーネントのフィールド 結果
どれでも 無い どれでも 項目がマニフェストになる
true(既定) ある どれでも plugin.json が権威。項目のコンポーネントのフィールドをそれに足す(hooks だけは、イベントごとにマッチャーが置き換わる)
false ある なし plugin.json がマニフェスト(true と同じ)
false ある 1つ以上 衝突。Plugin <name> has conflicting manifests: both plugin.json and marketplace entry specify components で、プラグインは読み込みに失敗する

プラグインの取得元#

項目の source は、そのプラグインを Claude Code がどこから取得するかを示します。相対パスの文字列か、source キーが種類を示すオブジェクトです("source": { "source": "github", "repo": "your-org/formatter" })。

種類 フィールド 備考
相対パス 文字列そのもの マーケットプレイスの中のディレクトリで、マーケットプレイスのルートから解決される。metadata.pluginRoot の下の名前だけの形でない限り、./ で始める。"." だけならルートそのもの
github repo・ref・sha owner/repo の形の GitHub リポジトリ
url url・ref・sha URL で指す任意の git リポジトリ
git-subdir url・path・ref・sha git リポジトリの1つのサブディレクトリ。スパースチェックアウトで取得する
npm package・version・registry npm のレジストリのパッケージか tarball のリンク。npm のクライアントで取得し、インストールスクリプトを動かさずに展開する
archive url・sha256 HTTPS の zip アーカイブ。v2.1.224 以降
command command・timeout・mode ユーザーのマシンで Claude Code が動かすコマンドが出力するディレクトリ。v2.1.229 以降

url と github は、マーケットプレイスの取得元の種類でもあり、そこでの url は git リポジトリではなく marketplace.json への直接のリンクです。git はマーケットプレイスの取得元だけ、npm は両方にあり、git-subdir・archive・command はプラグインの取得元だけです。マーケットプレイスのリポジトリ自体のサブディレクトリにあるプラグインには相対パスを、他のリポジトリのサブディレクトリには git-subdir を使います。github・url・git-subdir は、ref と sha を共有します。

  • ref:ブランチかタグ。既定はリポジトリの既定ブランチ
  • sha:40文字の小文字のコミット SHA。ref と sha の両方があると、sha をチェックアウトする。GitHub・GitLab・Bitbucket など多くの git ホストでは、ref が指すブランチやタグが上流で削除されていても、コミットがリポジトリから到達できる限り、インストールは成功する。AWS CodeCommit のように SHA でのコミットの取得に対応しないサーバーでは、ref が存在し、固定したコミットがそこから到達できる必要がある

取得、キャッシュ、版の付き方は、下の「読み込みの規則」にあります。

相対パス:パスはマーケットプレイスのルートから解決されます(./plugins/formatter は、マーケットプレイスのファイルが <root>/.claude-plugin/ にあっても <root>/plugins/formatter)。.. を含むパスは検証に失敗します。macOS と Linux では、先頭の ./ の後ろのどこかにバックスラッシュを含む項目のパスを拒否するので、スラッシュで書きます。

json
{ "name": "formatter", "source": "./plugins/formatter" }

相対パスが解決できるのは、Claude Code がマーケットプレイスのファイルを持っているときだけです。取得元の種類によって違います。

  • github・git・file・directory:マーケットプレイスのファイルを持っている
  • url:marketplace.json だけを取得するので、相対パスは解決できない。各プラグインに、github や git-subdir のようなオブジェクトの取得元を与える
  • settings:相対パスは丸ごと拒否される

名前だけ(/ を含まない1つのディレクトリ名。"formatter")で書くには、metadata.pluginRoot に、それらが解決されるディレクトリを設定します("pluginRoot": "./plugins" なら "source": "formatter" は ./plugins/formatter。v2.1.239 以降)。metadata.pluginRoot はマーケットプレイス内の相対パスである必要があり、すでに ./ で始まる取得元には影響せず、team-a/formatter のように / を含む取得元は名前だけではないので、metadata.pluginRoot があっても ./ の接頭辞が要ります。

github:repo は owner/repo、ref と sha は任意です。

json
{
  "name": "formatter",
  "source": {
    "source": "github",
    "repo": "your-org/formatter",
    "ref": "v2.0.0",
    "sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"
  }
}

url:url は完全な git の URL(https://・http://・file://・git@)です。.git の接尾辞は不要なので、Azure DevOps と AWS CodeCommit の URL もそのまま使えます。owner/repo の略記は受け付けません。

json
{
  "name": "formatter",
  "source": {
    "source": "url",
    "url": "https://gitlab.example.com/your-group/formatter.git",
    "ref": "main"
  }
}

git-subdir:url は完全な git の URL か、GitHub の owner/repo の略記を受けます。path がプラグインを持つサブディレクトリで、Claude Code はそのサブディレクトリだけをチェックアウトします。https か SSH の URL では、Claude Code がサーバーに部分クローンを求めるので、部分クローンに対応するホストなら、大きなモノレポの中のプラグインを、リポジトリの残りをダウンロードせずに入れられます。

json
{
  "name": "formatter",
  "source": {
    "source": "git-subdir",
    "url": "https://github.com/your-org/monorepo.git",
    "path": "tools/formatter"
  }
}

npm:フィールドは、package(レジストリのパッケージ名(@your-org/formatter など)、版を付けた名前(@your-org/formatter@2.0.0 など)、またはパッケージの tarball ファイルへの https のリンク)、version(package が版なしの名前のときに使う、版・semver の範囲・dist-tag。省くと latest を取る)、registry(既定のレジストリに無いパッケージのレジストリの URL)です。パッケージのインストールスクリプト(preinstall・postinstall など)は動かず、取得中に依存もインストールされません。パッケージの package.json の隣に対応するロックファイルがあれば、別の段で、同じくスクリプトを無効にして、Node.js のパッケージ依存を入れます。

Claude Code は、取得の前に package の値を検査します。拒否された値は、値と理由を示すメッセージでインストールが失敗します。拒否されるものには次があります。

  • git のアドレス、フォルダか file: のパス、npm: のエイリアス:git リポジトリには github・url・git-subdir の取得元を、マーケットプレイスの中のフォルダには相対パスを、エイリアスにはパッケージ自身の名前を使う
  • github.com・gist.github.com・gitlab.com・bitbucket.org・git.sr.ht の tarball のリンク:GitHub のリリースのダウンロードでも拒否される。ただし gitlab.com/api/v4/ の下の GitLab の npm レジストリのリンクは除く
  • http の tarball のリンク:インストールするユーザー自身の既定の npm レジストリを指すときを除き、拒否される

registry の URL は、インストールするユーザー自身の既定の npm レジストリでない限り https でなければなりません。ほかの http のレジストリでは、npm が接続する前にインストールが失敗します。

json
{
  "name": "formatter",
  "source": {
    "source": "npm",
    "package": "@your-org/formatter",
    "version": "^2.0.0",
    "registry": "https://npm.example.com"
  }
}

archive:url は https:// で、ループバック・リンクローカル・クラウドメタデータのホストを指せません(サイズ・タイムアウト・リダイレクト・展開の上限はプラグインを作って配る)。プラグインのルートは、zip の先頭か、1階層下にあってかまいません。sha256 はアーカイブのダイジェストを、大文字でも小文字でもよい64桁の16進数で書いたもので、設定すると、一致しないダウンロードを拒否します。

json
{
  "name": "formatter",
  "source": {
    "source": "archive",
    "url": "https://artifacts.example.com/formatter-2.0.0.zip",
    "sha256": "6bfa50e3d2e00c052b46abe51fff89346ac803e45771f76dcf6df1ab74cca5e1"
  }
}

command:IDE がユーザーの選んだツールチェーンのためにプラグインを出力する場合のように、ユーザーのマシンにインストールされたツールがプラグインのディレクトリを作るときに使います。Claude Code は、ユーザーがインストールか更新するときと、セッションごとに1回、そのコマンドを動かします。フィールドは次のとおりです。

フィールド 内容
command プラグインのディレクトリの絶対パスを1行で出力して 0 で終了するシェルコマンド。実行前に、ユーザーに全文が示されて確認される。印字可能な ASCII で500文字まで、空白が4つ以上続かない
timeout 1〜600の整数(秒)。既定は60
mode copy(既定)か link
json
{
  "name": "formatter",
  "source": {
    "source": "command",
    "command": "my-tool claude-plugin-path",
    "timeout": 120
  }
}

コマンドの要件は次のとおりです。

  • シェルと作業ディレクトリ:sh(Windows では cmd.exe)で、ユーザーのホームディレクトリから動く。絶対パスか PATH 上のコマンドにする
  • 出力:標準出力にプラグインのディレクトリの絶対パスをちょうど1行出し、timeout 秒以内に 0 で終了する
  • ディレクトリの中身:コマンドの終了までに、プラグインが完全にそろっている。パスは実行ごとに違ってよい

コマンドが 0 以外で終了する、timeout を超える、1つの絶対パス以外を出力する、のときはインストールか更新が失敗します。出力したディレクトリが次のどれかのときも失敗します。

  • プラグインの中身が無い:トップレベルに .claude-plugin/ も skills/・commands/・agents/・hooks/ も無い
  • セッション自身のディレクトリ:Claude Code を起動したディレクトリ、またはその親
  • ネットワークのパス:Windows で、出力したパスが UNC パス
  • コピーするには大きすぎる:copy モードで、ディレクトリが256 MiB を超えるか、項目が20,000を超える

mode は、出力されたディレクトリをコピーするか、その場で使うかを決めます。

  • copy:ディレクトリをプラグインのキャッシュへコピーし、プラグインの版をコピーしたファイルのハッシュから導く。コマンドの終了後に、ツールがディレクトリを削除や書き換えしてもよい。同一のファイルを出す再実行は最新とみなされる
  • link:プラグインのキャッシュの項目に、出力されたディレクトリの各トップレベルの項目へのリンクを置き、その場でファイルを読み込む。コピーも内容のハッシュもなく、サイズの上限も当てはまらない。レンダリングした SDK のエクスポートのような、コピーするには大きすぎるディレクトリに使う

link モードのプラグインには、次の要件があります。

  • ディレクトリをその場に置く:Claude Code は起動のたびにリンク経由でプラグインを読み込むので、プラグインがインストールされているあいだ、出力したディレクトリはそこに残す
  • 新しい内容を伝えるには別のパスを出力する:版はファイルの中身ではなく、出力したディレクトリの実パスとトップレベルの項目から決まる
  • トップレベルのシンボリックリンクはディレクトリの内側に保つ:トップレベルの項目が出力したディレクトリの外を指すシンボリックリンクだと、インストールは失敗する
  • node_modules を含める:link モードでは Node.js のパッケージ依存のインストールを行わないので、必要なパッケージをすでに含むディレクトリを出力する
  • ディレクトリの中で始めたセッション:出力したディレクトリかその下で始めたセッションは、プラグインを読み込まない
  • Windows では使えない:link モードのプラグインのインストールを拒否する。そこでは "mode": "copy" を宣言する

ユーザーがコマンドを承認する方法はプラグインを使う、変更後にユーザーに見えるものはプラグインを作って配るにあります。管理者は、disableCommandPluginSources で command の取得元を止められます。

マーケットプレイスの取得元#

マーケットプレイスの取得元は、marketplace.json を取得する場所を示します。CLI でマーケットプレイスを追加するときは Claude Code が文字列から作り、設定では自分で書きます。

  • claude plugin marketplace add:渡した文字列から Claude Code が取得元を作る
  • extraKnownMarketplaces:source オブジェクトとして自分で書く
  • strictKnownMarketplaces と blockedMarketplaces:管理者が、この2つのポリシーのリストに取得元を書く(前者が許可リスト、後者がブロックリスト)

url・git・github の名前は、マーケットプレイスの取得元では、プラグインの取得元と意味が違います。

種類の名前 マーケットプレイスの取得元として プラグインの取得元として
url marketplace.json への直接のリンク。フィールドは url・headers・headersHelper clone する git リポジトリ。フィールドは url・ref・sha
git clone する git リポジトリ。フィールドは url・ref・path・sparsePaths 無い
github GitHub リポジトリ。フィールドは repo・ref・path・sparsePaths GitHub リポジトリ。フィールドは repo・ref・sha で、path は無い

マーケットプレイスの取得元の全種類を、フィールド、それを作る claude plugin marketplace add の入力、3つの設定キーでの扱いとともに示します。

種類 フィールド marketplace add の入力 extraKnownMarketplaces strictKnownMarketplaces blockedMarketplaces
url url・headers・headersHelper git の形に合わない http:// か https:// の URL 読み込む 同じ URL を許可 同じ URL をブロック
github repo・ref・path・sparsePaths owner/repo・owner/repo@ref・owner/repo#ref 読み込む 同じ repo・ref・path を許可。repo は owner/* も可 同じものと、同じリポジトリの git の URL をブロック
git url・ref・path・sparsePaths user@host:path の URL、または .git で終わるか /_git/ を含むか github.com か gitlab.com のリポジトリを指す http:// か https:// の URL。#ref で ref を固定 読み込む 同じ URL・ref・path を許可 同じものと、同じ github.com リポジトリの他の綴りをブロック
npm package 作られない 読み込みに失敗:NPM marketplace sources not yet implemented 解析されるが何にも合わない(npm のマーケットプレイスは何も登録しないため) 解析されるが何にも合わない
file path .json ファイルへのパス 読み込む 同じパスを許可 同じパスをブロック
directory path ディレクトリへのパス 読み込む 同じパスを許可 同じパスをブロック
settings name・plugins・owner 作られない 読み込む 同じ name で plugins が同一の項目を許可 同じ name をブロック
skills-dir なし 作られない 読み込みに失敗:Unsupported marketplace source type 許可リストがあるあいだ、スキルのディレクトリのプラグインを読み込み続ける スキルのディレクトリのプラグインの読み込みを止める
hostPattern hostPattern 作られない 読み込みに失敗:Unsupported marketplace source type ホストが合う github・git・url の取得元を許可 それらの取得元をブロック
pathPattern pathPattern 作られない 読み込みに失敗:Unsupported marketplace source type path が合う file と directory の取得元を許可 それらの取得元をブロック

デフォルト・制約・種類ごとの意味を持つフィールドは次のとおりです。

フィールド 種類 内容
url url marketplace.json へのリンク。そのファイルだけをダウンロードするので、マーケットプレイスのプラグインは相対パスの取得元を使えない
url git clone する git リポジトリ
headers url 認証が要るホスト向けに、取得とともに送る HTTP ヘッダーの対応づけ
headersHelper url headers に書くには値の期限が短いヘッダーを出力するコマンド(v2.1.238 以降)
repo github marketplace add と extraKnownMarketplaces では、1つのリポジトリを指す必要がある。marketplace add は owner/* を有効な owner/repo の略記でないとして拒否する。extraKnownMarketplaces ではそのまま文字どおりに取られ、clone が失敗する
ref github・git ブランチかタグ。既定はリポジトリの既定ブランチ
path github・git リポジトリ内のマーケットプレイスのファイルのパス。既定は .claude-plugin/marketplace.json
path file マーケットプレイスのファイル自体。その場で読み込み、2階層上のディレクトリをマーケットプレイスのルートとするので、ファイルは <root>/.claude-plugin/marketplace.json に置く
path directory マーケットプレイスのルート(.claude-plugin/marketplace.json を含むディレクトリ)
sparsePaths github・git スパースチェックアウトするディレクトリの配列([".claude-plugin", "plugins"])。claude plugin marketplace add --sparse が設定する
skipLfs github・git 受け付けるが効果はない
name settings extraKnownMarketplaces のキーと同じでなければならず、予約名にはできない
plugins settings ホストされたファイルのないインラインのカタログ。各項目は name・source・description・version・strict・headers・headersHelper を取る。相対パスは解決するリポジトリが無いので、各項目の source はオブジェクトの種類で書く

hostPattern・pathPattern・skills-dir・github の repo の owner/* の形は、2つのポリシーのリスト(strictKnownMarketplaces と blockedMarketplaces)でだけ有効です。

  • hostPattern と pathPattern:Claude Code が取得元から取得する前に、取得元に対して試す正規表現
  • skills-dir:取得元ではない。strictKnownMarketplaces を設定すると、このリストに {"source": "skills-dir"} を足すまで、スキルのディレクトリのプラグインは読み込まれなくなる
  • owner/*:github の repo の値として、その GitHub のオーナーの下のすべてのリポジトリに合う。v2.1.223 以降

設定では、extraKnownMarketplaces はマーケットプレイス名から、source を持つオブジェクトへの対応づけです。strictKnownMarketplaces と blockedMarketplaces は取得元オブジェクトの配列です(許可リストとブロックリストの照合の規則と記述例はプラグインを作って配る)。

json
{
  "extraKnownMarketplaces": {
    "your-marketplace": {
      "source": {
        "source": "git",
        "url": "https://git.example.com/your-org/your-marketplace.git",
        "ref": "main"
      }
    }
  }
}
json
{
  "strictKnownMarketplaces": [
    { "source": "github", "repo": "your-org/*" },
    { "source": "hostPattern", "hostPattern": "^git\\.example\\.com$" }
  ]
}

検証メッセージ#

claude plugin validate <path> は、マーケットプレイスのルートかマーケットプレイスのファイルそのものを受けます。エントリは plugins.1.source か plugins[1].source のように、インデックスで名指しされます。plugins[2] plugin.json → のように項目のインデックスと plugin.json → が付いたメッセージは、そのプラグイン自身のファイルについてのものです。Claude Desktop のフラグ名に触れる警告は、Claude Desktop が拒否する名前を指します。マーケットプレイスの階層のメッセージと、それが指すフィールドは次のとおりです。

メッセージ 水準 フィールド
Marketplace must have a name エラー name が空
Marketplace name cannot contain spaces. Use kebab-case (e.g., "my-marketplace") エラー name
Marketplace name cannot contain path separators (/ or \), ".." sequences, or be "." エラー name
Marketplace name impersonates an official Anthropic/Claude marketplace エラー name(予約された名前を参照)
Marketplace name cannot contain control or bidirectional-formatting characters エラー name に、エスケープや改行のような制御文字か、Unicode の双方向の書式文字がある
Marketplace name "inline" is reserved for --plugin-dir session plugins と、builtin・skills-dir・synced・claude-plugin-test・npm・pip・uv・cargo・github・gh の各形 エラー name
Author name cannot be empty エラー owner.name
Plugin name cannot contain spaces. Use kebab-case (e.g., "my-plugin") エラー plugins[i].name
Plugin name cannot contain control or bidirectional-formatting characters エラー plugins[i].name
Plugin name "x" is reserved: it passes as one of Anthropic's own エラー plugins[i].name。予約された名前はマニフェストの name を参照
Plugin name "x" reads as one of Anthropic's own 警告 plugins[i].name
Claude Code cannot install plugins from marketplace "x". Each part of a plugin id (plugin@marketplace) may use only the letters a-z and A-Z, digits, ".", "_" and "-", and must start with a letter or digit. Change the marketplace's "name". エラー name
Claude Code cannot install plugin "x". Each part of a plugin id (plugin@marketplace) may use only the letters a-z and A-Z, digits, ".", "_" and "-", and must start with a letter or digit. Change this entry's "name". エラー plugins[i].name
Duplicate plugin name "x" found in marketplace エラー 2つの項目が同じ name を持つ
plugins.i.source: Invalid input エラー 項目の source がどの種類にも合わない(下の説明)
plugins[i].source: Path contains "..": <path> エラー マーケットプレイスのルートから外れる相対の source
source.source: 'unsupported' is a parse-time placeholder and cannot be authored エラー plugins[i].source
Plugin "x" sets headersHelper but is not "strict": false エラー archive 項目の plugins[i].headersHelper
chain does not resolve (<reason>) — target must be a name in plugins[], a key in renames, or null エラー renames.<old>
target "x" is not a valid plugin name (PluginIdSchema) エラー renames.<old>
Unknown field 'x'. Claude Code ignores it at load time. 警告 トップレベル・metadata の下・項目・項目の relevance の下の、名指しされたキー
Marketplace has no plugins defined 警告 plugins が空
Plugin "x" sets headers/headersHelper, which only apply to "archive" sources; they have no effect on this entry. 警告 source が archive でない項目の plugins[i].headers か plugins[i].headersHelper
Plugin "x" fetches its archive with a headersHelper but sets no sha256 pin 警告 plugins[i].source.sha256
Header "x" is a request-routing/identity header that catalog entries may not set; Claude Code drops it at download time. 警告 plugins[i].headers.<name>
Local source "x" is or traverses a symlink, so <path> was not read 警告 plugins[i].source
No marketplace description provided. Adding a description helps users understand what this marketplace offers 警告 description
Entry declares version "x" but <path>/plugin.json says "y". At install time, plugin.json wins 警告 相対パスの項目の plugins[i].version
'relevance' must be an object containing topic and signals; got <type>. It will be ignored at load time. 警告 plugins[i].relevance
'metadata' must be a free-form object; got <type>. It will be ignored at load time. 警告 plugins[i].metadata
'experimental' must be an object containing component declarations; got <type>. It will be ignored at load time. 警告 plugins[i].experimental
Marketplace name "x" is reserved in Claude Desktop 警告 name が org・org-provisioned・unknown。Claude Desktop がそのマーケットプレイスを拒否する
Marketplace name "x" is not accepted by Claude Desktop (letters, digits, ".", "_", "-"; must start alphanumeric; max 128 chars) 警告 name。Claude Desktop がそのマーケットプレイスを拒否する
Plugin name "x" is not accepted by Claude Desktop (letters, digits, ".", "_", "-"; must start alphanumeric; max 128 chars) 警告 plugins[i].name。Claude Desktop がその項目を落とす

source の Invalid input は、オブジェクトがどの取得元の種類にも合わないことを意味します。次の原因を確かめます。

  • "." か metadata.pluginRoot の下の名前だけの形以外で、./ で始まらない相対パス
  • .. を含む npm の package
  • プラグインの取得元の種類でない source の種類
  • 必須のフィールドが欠けているか型が違う既知の種類(repo の無い github など)

検証がすべての失敗を見つけるわけではありません。ファイルパスや配列で書いた項目の hooks は検証を通り、プラグインの読み込み時にだけエラーが出ます。source の取得エラーも、検証ではなくインストールのあとにだけ出ます。読み込めなかったプラグインは claude plugin list がエラーつきで示します。

claude plugin コマンド#

claude plugin <subcommand> を、シェルかスクリプトから、Claude Code のセッションの外で実行します。/plugin のパネルを開かずに、プラグインを入れて管理できます。claude plugins は claude plugin の別名です。claude plugin --help で、お使いの版にあるサブコマンドを確かめられます。

  • 終了コード:成功は 0、失敗は 1。validate は予期しないエラーで 2 も返し、eval は専用のコードを加える
  • プラグインの引数:<plugin> は、プラグインの name か name@marketplace。2つのマーケットプレイスが同じ名前を出しているときは、修飾した形を使う。configure は修飾した形だけを取る
  • スコープ:--scope は user・project・local を取り、コマンドが書く設定ファイルを示す。update は managed も取る
サブコマンド 内容
claude plugin init <name> ~/.claude/skills/<name>/ に新しいプラグインの雛形を作る(別名 new)
claude plugin install <plugin> 追加済みのマーケットプレイスからプラグインを入れる(別名 i)
claude plugin uninstall <plugin> 1つのスコープからプラグインを外す(別名 remove・rm)
claude plugin enable <plugin> 無効なプラグインを有効にする
claude plugin disable [plugin] プラグインを、アンインストールせずに無効にする
claude plugin update <plugin> マーケットプレイスが出す最新の版へ更新する
claude plugin list 入れたプラグインを、版・スコープ・状態とともに一覧にする
claude plugin details <name> プラグインのコンポーネントの一覧と、予想されるトークンのコストを出す
claude plugin configure <plugin> userConfig のオプションを見て、標準入力から値を保存する(v2.1.285 以降)
claude plugin prune どのプラグインも要らなくなった、自動で入った依存を外す(別名 autoremove)
claude plugin eval [target] プラグインの eval ケースを動かして採点する(v2.1.269 以降)
claude plugin eval init [name] プラグインの eval スイートを作る(v2.1.269 以降)
claude plugin tag [path] プラグインのリリースの注釈付き git タグを作る
claude plugin validate <path> プラグインかマーケットプレイスのマニフェストなどを検証する
claude plugin marketplace add <source> マーケットプレイスを追加して、設定ファイルに宣言する
claude plugin marketplace list 追加した全マーケットプレイスを、取得元とともに一覧にする
claude plugin marketplace remove <name> マーケットプレイスの宣言を、設定から外す(別名 rm)
claude plugin marketplace update [name] 1つか全部のマーケットプレイスを、取得元から更新する

plugin init#

~/.claude/skills/<name>/ に、新しいプラグインの雛形を作ります。次のセッションから、インストールなしで <name>@skills-dir として読み込まれます。<name> は、~/.claude/skills/ の下のディレクトリ名と、そのマニフェストのプラグインの name になります。別の場所を指定するフラグはありません(プロジェクトの中に作るならプラグインを作って配る)。

bash
claude plugin init <name> [options]
claude plugin init my-helper --with skills hooks
フラグ 内容
--description <text> マニフェストの説明
--author <name> 作者名。既定は git config user.name
--author-email <email> 作者のメールアドレス。既定は git config user.email
--with <components...> skills・agents・hooks・mcp・lsp・output-style・channel の雛形ファイルも作る
-f, --force 対象の既存の .claude-plugin/ を上書きする

Claude Code は書いたものを検証し、Created plugin "my-helper" at ~/.claude/skills/my-helper と、読み込まれる ID と、無効にする claude plugin disable のコマンドを出します。安全に雛形を作れないときは、何も書かずに 1 で終了し、メッセージが理由を示します。一般的な理由は、未知の --with の値、--force なしでの対象の既存の雛形、スキルのディレクトリのプラグインを止める管理設定です。

plugin install#

追加済みのマーケットプレイスからプラグインを入れます。

bash
claude plugin install <plugin> [options]
claude plugin install formatter@my-marketplace --scope project
フラグ 内容
-s, --scope <scope> インストールのスコープ。user・project・local。既定は user
--config <key=value> プラグインのマニフェストが宣言する userConfig のオプションを設定する。オプションごとにフラグを繰り返す。<server>.<key> の形のキーは、プラグイン内にあるバンドルファイルの、同梱の MCP サーバーが自身の user_config で宣言する設定を設定する(この形は v2.1.285 以降)
-y, --yes 表示されたインストールコマンドを、Run this command now? のプロンプトなしで承認する。Claude Code のセッションの中(Bash ツールやフック)から実行すると無視される(v2.1.229 以降)
--accept-command <sha256> -y の代わりに、前の --json の実行が shownCommand で報告した sha256 のコマンドを承認する。-y と同時には使えない(v2.1.271 以降)
--json 結果を、人向けのメッセージの代わりに、標準出力の最後の行の1つの JSON オブジェクトとして出す。スクリプト向け(v2.1.268 以降)

ほとんどのプラグインはプロンプトなしで入ります。マーケットプレイスの項目がコマンドを実行して入れるプラグインや、ダウンロードに headersHelper を設定するプラグインでは、Claude Code が先にコマンドを出して Run this command now? [y/N] と尋ねます。自分の端末から -y を渡すと、プロンプトなしでそのコマンドを承認します。

  • 標準入力か標準出力が TTY でなく、-y も --accept-command も渡さないとき:インストールは拒否される。出力は、コマンドが表示されただけだと述べ、終了コードは 1
  • Claude が Bash ツールでコマンドを実行するとき:-y は無視される。自分の端末から実行する

成功すると Successfully installed plugin: formatter@my-marketplace (scope: project) と出ます。新しく入らなかったときは、理由が出ます。

状況 出力と終了コード
そのスコープにすでに入っている Plugin "formatter@my-marketplace" is already installed (scope: project)、終了コード 0
コマンドの取得元のプロンプトを断った Aborted.、終了コード 1
headersHelper のプロンプトを断った、または TTY なしで確認できない Aborted — the command was not run.、終了コード 1

--json では、標準出力の最後の行が1つの JSON オブジェクトです。マーケットプレイスが宣言するコマンドは、その前に出るので、その最後の行だけを解析します。次の3つのフィールドは常にあります。

  • command:実行したサブコマンド(install など)
  • outcome:ok か failed
  • message:人向けの結果の説明

pluginId・scope・failureCode などは、当てはまるときだけ出ます。plugin uninstall・plugin update・plugin enable・plugin disable の --json も、そのサブコマンド固有のフィールドを持つ同じオブジェクトを出します。--scope が不正といった使い方の誤りは、結果の行を出さず、理由を標準エラーへ出して 1 で終了します。

--json の実行が、マーケットプレイスの宣言したコマンドを表示して実行しなかったときは、failed の結果に shownCommand オブジェクト(表示したコマンド、そのプラグイン、コマンドの sha256 など)も付きます。そのコマンドだけを承認するには、その sha256 を --accept-command に渡して、自分の端末から再実行します(このフラグは Claude Code のセッションの中では効きません)。sha256 は、そのコマンド・プラグイン・マーケットプレイスのカタログに対する承認としてだけ数えられ、表示後にどれかが変わっていると、Claude Code は sha256 を受け付けず、コマンドをもう一度表示します(実行自身のマーケットプレイスの更新が取り込んだ変更も数えます)。shownCommand.acceptCommandMatched が false なら、渡した sha256 は、いま表示されているコマンドと一致していません。そのコマンドを確認してから、その sha256 で再実行します。

plugin uninstall#

1つのスコープから、入れたプラグインを外します。

bash
claude plugin uninstall <plugin> [options]
claude plugin uninstall formatter@my-marketplace --scope project
フラグ 内容
-s, --scope <scope> アンインストールするスコープ。user・project・local。既定は user
--keep-data プラグインの永続データのディレクトリ ~/.claude/plugins/data/<id>/ を残す
--prune どの残りのプラグインにも要らなくなった、自動で入った依存も外す
-y, --yes --prune の確認のプロンプトを飛ばす。標準入力か標準出力が TTY でないときは --prune に必須
--json 結果を、標準出力の最後の行の1つの JSON オブジェクトで出す。plugin install --json と同じ形式。--prune とは併用できない(v2.1.268 以降)

成功すると Successfully uninstalled plugin: formatter (scope: project) と出ます。そのスコープに入っていないと、Failed to uninstall plugin "formatter@my-marketplace": で始まる行を出して 1 で終了します。失敗の行が "formatter" was not uninstalled: と設定ファイルを名指しして続くときは、そのスコープの設定がまだプラグインを有効にしていないと確認できなかったので、プラグインは保存したものとともに入ったままです(--json では failureCode: "settings_still_on"。この確認は v2.1.282 以降)。

プラグインを、入っている最後のスコープから外すと、保存済みのオプションとシークレットと、データのディレクトリ ~/.claude/plugins/data/<id>/ も消えます。例外は3つです。

  • --keep-data:データのディレクトリが残る
  • 同じフォルダを別のインストール済みプラグインが使っている(このプラグインの ID と大文字小文字だけが違うもの):データのディレクトリが残る
  • そのスコープからプラグインを外したあと、インストール済みのプラグインの一覧を読み戻せない:プラグインが別のスコープにまだ入っているかもしれないので、オプション・シークレット・データのディレクトリがすべて残る。アンインストールは成功し、メッセージが、残ったものとその消し方を示す。--json では、結果に savedKept: "install_records_unreadable" が付く

--json では keptData が、ディレクトリが残ったかを報告し、/plugin は残ったとき · data preserved と表示します。--keep-data なしでディレクトリが残る場合の報告は v2.1.281 以降、savedKept は v2.1.282 以降です。

plugin enable と plugin disable#

無効なプラグインを有効にします(enable)。プラグインを、アンインストールせずに無効にします(disable)。claude.ai から同期されたプラグインには、<name>@synced を渡します。

bash
claude plugin enable <plugin> [options]
claude plugin disable [plugin] [options]
フラグ 対象 内容
-s, --scope <scope> 両方 user・project・local。省略すると自動で判定される
-a, --all disable 有効なプラグインをすべて無効にする。プラグイン名や --scope とは併用できない
--json 両方 結果を、標準出力の最後の行の1つの JSON オブジェクトで出す。plugin install --json と同じ形式(v2.1.268 以降)

--scope なしでは、local・project・user の順に設定ファイルを調べ、そのプラグインに言及する最初のスコープを使います。プラグインが宣言されていないスコープを --scope で渡すと、上書きを書くか、失敗します。

  • 宣言しているスコープより優先するスコープ:渡したスコープに上書きを書く(claude plugin disable formatter --scope local は、project で有効なプラグインを自分だけ無効にする)
  • それ以外のスコープ:Plugin "formatter" is installed at project scope, not user. Use --scope project or omit --scope to auto-detect. で失敗する

すでに有効(無効)なとき、Plugin "formatter" is already enabled(is already disabled)と出て 1 で終了します。--json では、結果が "failureCode": "already_in_goal_state" と "alreadyInGoalState": true を持つので、スクリプトはこの場合を成功として扱えます。disable にプラグイン名も --all も渡さないと、Please specify a plugin name or use --all to disable all plugins と出て 1 で終了します。

  • enable:プラグインが依存を宣言していれば、それも有効にする。依存が入っていない(各依存の claude plugin install コマンドを出して失敗する)、依存が組織のプラグインのポリシーでブロックされている(ブロックされた依存を名指しして失敗する)、依存が対象のスコープより優先するスコープで false になっている(そのスコープで依存を有効にするか、--scope でそこへ書く)ときは失敗する
  • disable:他の有効なプラグインがそれに依存している(名指しされた依存元を先に無効にするよう案内して失敗する)、組織が同期されたプラグインとして必須にしている(失敗し、何も保存しない)ときは、まだ要るプラグインなので失敗する

成功すると Successfully enabled plugin: formatter (scope: project)(判定したスコープを名指しする)、Successfully disabled plugin: formatter (scope: project) と出ます。

plugin update#

プラグインを、マーケットプレイスが出す最新の版に更新します。新しい版は、次のセッションか、開いているセッションで /reload-plugins を実行したあとに読み込まれます。

bash
claude plugin update <plugin> [options]
claude plugin update formatter@my-marketplace
フラグ 内容
-s, --scope <scope> 更新するスコープ。user・project・local・managed。省略すると自動で判定される
-y, --yes command の取得元のプラグインの、変更されたインストールコマンドを、プロンプトなしで承認する。標準入力か標準出力が TTY でないときは、--accept-command を渡さない限り必須(v2.1.229 以降)
--accept-command <sha256> -y の代わりに、前の --json の実行が shownCommand で報告した sha256 のマーケットプレイス宣言のコマンドを承認する。-y と同時には使えない(v2.1.271 以降)
--json 結果を、標準出力の最後の行の1つの JSON オブジェクトで出す。plugin install --json と同じ形式(v2.1.268 以降)

--scope を省略すると、現在のプロジェクトでプラグインが入っている、最も具体的なスコープ(local・project・user・managed の順に確認)で更新します。v2.1.281 より前は、--scope を省略すると user を使ったので、project か local だけに入っているプラグインの更新は Plugin "<name>" is not installed at scope user で失敗しました。その版では --scope を渡します。managed は、更新はできるがインストール先にはできない唯一のスコープです(管理者が入れたプラグインについてはプラグインを作って配る)。

Checking for updates for plugin "formatter@my-marketplace"… と出て、結果が続きます。新しいものが無いと formatter is already at the latest version (1.0.0). と出て 0 で終了します(依存のインストールを再試行して、それが失敗したときを除く)。名前だけも渡せ、Claude Code が入れたプラグインと照合します。別のマーケットプレイスの入れたプラグインが同じ名前のときは、更新を拒否し、実行すべき修飾した plugin-name@marketplace-name のコマンドを並べます(名前だけでの更新は v2.1.246 以降)。

すでに最新の版のときは、キャッシュのコピーにある、終わっていない依存のインストールを再試行することもあります。再試行が動く場合と飛ばす場合は、トラブルシューティングの「The packages it lists are not installed」にあります。再試行が失敗すると、出力は Failed to update plugin "formatter@my-marketplace" と理由になり、終了コードは 1 です。v2.1.287 より前は、インストールを再試行せずに、プラグインが最新の版だと報告しました。

plugin list#

入れたプラグインを、版・スコープ・状態とともに一覧にします。

bash
claude plugin list [options]
フラグ 内容
--json 一覧を JSON で出す
--available 入れていないが、マーケットプレイスが出しているプラグインも一覧にする。--json が無いと効かない
--data-size [plugin] 入れた各プラグイン(または name@marketplace で指定した1つ)の保存済みデータのディレクトリのサイズを測る。--json が無いと効かない。名前に対するインストールの記録が無いと、--data-size names a plugin that is not installed と出し、一覧を出さずに 1 で終了する(v2.1.285 以降)

人向けの出力は、プラグインの読み込まれ方でグループ分けされます。

見出し 内容
Installed plugins: マーケットプレイスから入れたプラグイン
Session-only plugins (--plugin-dir / --plugin-url): claude --plugin-dir ./my-plugin plugin list のように、同じコマンドでそれらのフラグが読み込んだプラグイン
Skills-directory plugins (.claude/skills/*): スキルのディレクトリで Claude Code が見つけたプラグイン
Synced from claude.ai claude.ai のアカウントから同期されたプラグイン

どのグループにも無いと、No plugins installed. Use `claude plugin install` to install a plugin. と出ます。--json では、インストールごとに1つのオブジェクトの配列を出します。id・version・scope・enabled・installPath は常にあり、他は当てはまるときだけ出ます。

フィールド 型 内容
id 文字列 インストールは name@marketplace、セッション限りのプラグインは name@inline、スキルのディレクトリのプラグインは name@skills-dir、claude.ai から同期されたプラグインは name@synced
version 文字列 マーケットプレイスからのインストールでは、インストール時に Claude Code が計算した版。セッション限り・スキルのディレクトリ・同期のプラグインでは、マニフェストの version(無ければ unknown)
scope 文字列 インストールは user・project・local・managed。スキルのディレクトリのプラグインは user か project。セッション限りは session。同期は synced
enabled 真偽値 マージした設定でプラグインが有効か
installPath 文字列 プラグインの読み込み元のディレクトリ。セッションがマーケットプレイスのフォルダからその場で読み込むプラグインを除く
readFromFolder 文字列 セッションがマーケットプレイスのフォルダからその場で読み込むプラグインの、そのフォルダの中のソースのディレクトリ。v2.1.289 以降
folderVersion 文字列 readFromFolder があるとき、Claude Code がそのフォルダから読み込んだときのプラグインの version。上の version と違うことがある。プラグインが読み込まれなかったか、版を宣言していないときは無い。v2.1.289 以降
installedAt 文字列 インストールの ISO タイムスタンプ。マーケットプレイスからのインストールだけ
lastUpdated 文字列 最後の更新の ISO タイムスタンプ。マーケットプレイスからのインストールだけ
projectPath 文字列 インストールが属するプロジェクト。project と local のスコープだけ
mcpServers オブジェクト マーケットプレイスから入れたプラグインが持つとき、その MCP サーバーの定義
errors 文字列の配列 プラグインの読み込みに失敗したときの読み込みエラー
notes 文字列の配列 読み込みエラーではない警告。作成上の問題や、インストールされていないパッケージなど
errorDetails オブジェクトの配列 errors の各項目に1つ。診断の type と、プラグイン・マーケットプレイス・サーバー・ファイルなど、それが参照する名前(v2.1.268 以降)
noteDetails オブジェクトの配列 notes の各項目の同じ詳細オブジェクト(v2.1.268 以降)
hasUserConfig 真偽値 プラグインが読み込まれ、マニフェストが userConfig のオプションを宣言しているとき、true で出る。読み込みに失敗したプラグインには、マニフェストの宣言にかかわらず出ない。保存された値は含まれない(v2.1.285 以降)
projectEnabled 真偽値 プロジェクトの共有 .claude/settings.json がプラグインを有効にしているか。マーケットプレイスからのインストールだけ(v2.1.285 以降)
dataDirSize オブジェクト --data-size で、プラグインの保存済みデータのディレクトリのサイズを bytes と human で。ディレクトリが無いか空なら出ない。マーケットプレイスからのインストールだけ(v2.1.285 以降)
dataDirUnreadable 真偽値 --data-size で、保存済みデータのディレクトリがあるのに測れなかったとき true。マーケットプレイスからのインストールだけ(v2.1.285 以降)

--json --available では、配列の代わりに1つのオブジェクトを出します。installed が入れたプラグインのオブジェクトの配列、available が、入れていないマーケットプレイスのプラグインごとに1つのオブジェクトです。

フィールド 型 内容
pluginId 文字列 name@marketplace
name 文字列 マーケットプレイスでのプラグインの名前
marketplaceName 文字列 それを出すマーケットプレイス
source 文字列かオブジェクト マーケットプレイスの項目の取得元。相対パスなら文字列、それ以外はオブジェクト
description 文字列 項目の説明(あれば)
version 文字列 項目が宣言する版(あれば)
installCount 数値 プラグインについて Claude Code が持つインストール数(あれば)

plugin details#

プラグインのコンポーネントの一覧と、予想されるトークンのコストを出します。プラグインは読み込まれている必要があります(インストール済み・スキルのディレクトリで見つかったもの・同じコマンドの --plugin-dir か --plugin-url で渡したもの)。<name> はプラグインの name か name@marketplace です。--help 以外のフラグはありません。

bash
claude plugin details <name>

プラグインの名前・版・説明・取得元を出し、続けて次の節を出します。

節 内容
Component inventory プラグインのスキル・エージェント・フック・MCP サーバー・LSP サーバー
Projected token cost プラグインがすべてのセッションに足す、常時のトークン
Per-component (rounded) スキル・エージェント・コマンドごとの、常時と呼び出し時の見積もり。プラグインに無ければ省かれる

2つのコストの数字の意味はプラグインを作って配るのコスト計測の節にあります。読み込まれていないプラグインでは、Plugin "formatter" not found. Run `claude plugin list` to see installed plugins, or pass --plugin-dir <path> to load one from disk. と出して 1 で終了します。

plugin configure#

入れたプラグインの userConfig のオプションと設定済みかを表示するか、標準入力で渡された値を保存します(v2.1.285 以降)。

bash
claude plugin configure <plugin>
claude plugin configure formatter@my-marketplace --values-stdin < values.json
フラグ 内容
--values-stdin 標準入力から、1行の文字列の JSON オブジェクトとしてオプションの値を読み、保存する。省いたオプションは保存済みの値のまま
--json 結果を、標準出力に1つの JSON オブジェクトとして出す。--values-stdin なしでは、オプションの schema と choices、開始時の inputs、configured と unconfigured のオプション名を持つ。--values-stdin ありでは、saved のオプション名と、読み戻せたときは unconfigured のものを持つ

フラグなしでは、各オプションを、required か optional、マニフェストが sensitive と宣言するオプションには sensitive、set か not set の最大3つのラベルで一覧にします。保存された値は出しません。--json では、sensitive でないオプションの保存値を含み、sensitive なものの文字列は出しません。値を保存するには、オプションのキーを文字列の値に対応づける JSON オブジェクトをファイルに書き、標準入力で渡します({"api_url": "https://example.com"} を持つ values.json なら、上の2行目のコマンド)。

Claude Code は、各値をオプションの宣言した型で検証し、Configuration saved. Restart Claude Code to apply it. と出します。マニフェストが宣言していないキーか、検証に失敗する値があると、何も保存せず、Failed to save configuration: と理由を出して 1 で終了します(--json では、拒否された値が、message と、1つのオプションの誤りなら option キーを持つ refused フィールドの付いたオブジェクトも標準出力へ出す)。claude plugin list が示す、プラグインの完全な name@marketplace の ID を渡します。名前だけは受け付けません。その ID のプラグインが読み込まれていないと、No installed plugin has the id "<plugin>". と出て 1 で終了します。同梱の MCP サーバーの設定は、plugin install --config、または /plugin の「Configure」を使います。

plugin prune#

どのインストール済みプラグインにも要らなくなった、自動で入った依存を外します。自分で入れたプラグインは外しません。

bash
claude plugin prune [options]
claude plugin prune --dry-run
フラグ 内容
-s, --scope <scope> 掃除するスコープ。user・project・local。既定は user
--dry-run 外すものを、外さずに一覧にする
-y, --yes 確認のプロンプトを飛ばす。標準入力か標準出力が TTY でないときは必須

--dry-run は、孤立した依存を一覧にして (dry run — nothing removed) で終わります。外すものが無いと Nothing to prune で始まる行を出します。--dry-run なしでは、プロンプトで確認するか -y を渡したときだけ外します。プロンプトにどう答えても終了コードは 0 です。

端末とフラグ 動作
対話の端末で -y なし 孤立した依存を一覧にして Remove? [y/N] と尋ねる
どの端末でも -y あり 外して Removed N auto-installed plugins: <names> と出す
標準入力か標準出力が TTY でなく -y なし 一覧と Not a TTY — run `claude plugin prune -y` to remove. を出し、何も外さない

plugin eval#

プラグインの eval ケースを動かし、採点した結果を報告します(v2.1.269 以降。ケースの形式・グレーダー・結果・CI での使い方はプラグインの評価(evals))。各ケースは、プロンプトとグレーダーで、対象のプラグインだけを読み込んだ隔離したセッションで複数回動かされ、既定では、差を示すためプラグインなしでも動かされます。

bash
claude plugin eval [target] [options]

target(省略可)の既定は現在のディレクトリで、次の形を取ります。プラグインのディレクトリ、1つの prompt.md か case.yaml ファイル、入れたプラグインを name か name@marketplace で、name@skills-dir。--tag・--allow-tools・--json の前に target を置きます。これらのオプションは、後ろの語を値として取るので、あとに書いた target は、タグ・ツール名・JSON の出力先と読まれます。主なオプションは次のとおりです(--case・--tag・--output-dir・--report・--allow-real-servers・--keep-temp・--verbose などは claude plugin eval --help で見ます)。

オプション 内容 既定
--runs <n> 各アームのケースごとの実行回数 各ケースの runs、無ければ3
-j, --concurrency <n> 同時に動かすエージェントのセッション数(1〜8)。レート制限を共有する 1
--model <model> 試験するエージェントのモデル 各ケースの model、無ければ設定されていれば ANTHROPIC_MODEL、無ければ Claude Code の既定
--judge-model <model> llm と baseline のグレーダーのモデル バックグラウンドタスクのモデル
--ablation <mode> none か with-without ケースごとに決まる
--threshold <0..1> どれかのケースがこれを下回ると 1 で終了する 1.0
--max-cost-usd <usd> 支出がこれに達したら次の実行の前に止め、2 で終了し、途中までの結果を報告する 上限なし
--allow-tools <tools...> 読み取り専用のセット以外のツール(Bash・Write・Edit・"mcp__plugin_<plugin>_<server>__*" など)を許す
--scaffold 各ケースの scaffold_script を動かす オフ
--trust-plugin 初回の信頼のプロンプトを飛ばす。CI 向け オフ
--mocks <mode> record か off record
--eval-dir <dir> プラグインの下の、ケースを持つディレクトリ マニフェストの experimental.evals、無ければ evals
--json [path] 結果のドキュメントを標準出力へ出すか、.json のパスへ書く
--no-publish HTML のレポートを手元だけに置く
終了コード 意味
0 すべてのケースがしきい値を満たす
1 失敗したケース、読み込みエラー、信頼されていないプラグインのディレクトリ
2 途中までの実行
130 中断された
143 終了させられた

plugin eval init#

カレントディレクトリのプラグインの eval スイートを作ります(v2.1.269 以降)。プラグインのルート(.claude-plugin/plugin.json かスキルの SKILL.md があるディレクトリ)で実行します。別のディレクトリにわざと作るには --eval-dir を渡します。

bash
claude plugin eval init [name] [options]

端末では、作成のインタビューのために対話の Claude Code のセッションを開きます。インタビューで Claude は、プラグインを読み、何をうまくやるべきかを尋ね、ケースとグレーダーを提案し、ケースのファイルを書き、ケースを動かして、グレーダーが自分と同じように採点するか、採点を一緒に見直します。--bare を付けるか端末がないと、代わりに1ケースの空のテンプレートを書きます。Claude Code のセッション内から実行すると、テンプレートを書かず、そのセッションが従うインタビューの指示を表示します。name(省略可)はケース名で、--bare か端末なしでは、そのケースの空のテンプレートを書くため必須です。ケース名は英字か数字で始まり、英数字・.・_・- だけを含みます。どのプラットフォームでも、con や . で終わる名前のように、Windows が保存できない名前は拒否します。

オプション 内容 既定
--bare インタビューを動かさず、<name> の空の prompt.md と graders/criteria.md を書く
-i, --interactive インタビューを必須にする。端末が無いときはテンプレートを書かずに失敗する
--eval-dir <dir> ケースを書く、カレントディレクトリの下のディレクトリ マニフェストの experimental.evals、無ければ evals

plugin tag#

プラグインのリリースに、<name>--v<version> という名前の注釈付き git タグを作ります。タグを付ける前に、plugin.json と、それを載せるマーケットプレイスの項目が、版で一致しているかを確認します。[path] はプラグインのディレクトリで、既定はカレントディレクトリです。そのプラグインを載せる .claude-plugin/marketplace.json まで、そのディレクトリから上に辿って、マーケットプレイスの項目を探します。

bash
claude plugin tag [path] [options]
claude plugin tag plugins/formatter --dry-run
フラグ 内容
--push タグを作ったあと、--remote に押す
--dry-run タグを作らずに、付けるものを出す
-f, --force 作業ツリーが汚れていないかの確認と、タグがすでにあるかの確認を飛ばす
-m, --message <msg> タグの注釈のメッセージ。%s は版を表す。既定は <name> <version>
--remote <name> --push で押す先のリモート。既定は origin

--dry-run は、計画(プラグイン名、版とそれを得たファイル、該当するマーケットプレイスの項目、タグ名、実行する git tag と git push のコマンド)を出します。--dry-run なしでは Created tag formatter--v1.0.0 と、Pushed to origin か自分で実行する push のコマンドを出します。push が失敗してもタグは手元にできていて、コマンドはエラーで終わります。安全にタグを付けられないときは、1 で終了して理由を出します。一般的な理由は、plugin.json にもマーケットプレイスの項目にも version が無い、タグがすでにある、作業ツリーが汚れている、です。リリースにタグを付ける時期はプラグインを作って配るにあります。

plugin test#

Mod(モッド、mod)、つまりコードがイベントハンドラを登録するプラグインのテストを実行します。セッションもサインインもネットワークも要りません。テストの書き方は Mod を作る・試すにあります。

bash
claude plugin test [directory]

[directory] は Mod のディレクトリで、既定はカレントディレクトリです。その下の、名前が .test.ts か .test.tsx で終わるファイルをすべて実行し、テストが失敗すると終了コード 1 で終わります。

./first-mod の Mod のテストを実行する例です。

bash
claude plugin test ./first-mod

plugin validate#

プラグインのマニフェスト、マーケットプレイスのマニフェスト、ディレクトリのスキル・エージェント・コマンドを検証し、CI が扱えるコードで終了します(マニフェストでの検査内容は上の「マニフェスト」と「マーケットプレイス」)。

bash
claude plugin validate <path> [options]
claude plugin validate ./my-plugin --strict
フラグ 内容
--strict 警告をエラーとして扱う。実行時は許される未知のフィールドやメタデータの欠けが、失敗になる
--json 検証のレポートを、同じ終了コードで1つの JSON オブジェクトとして出す(v2.1.259 以降)

<path> はマニフェストのファイルかディレクトリです。ディレクトリを渡すと、そこで見つかるもので、検証する対象が決まります。

  1. .claude-plugin/marketplace.json があればそれ
  2. 無ければ .claude-plugin/plugin.json
  3. 無ければ、ディレクトリの名前で選ばれるコンポーネントのファイル(マニフェストなしのコンポーネントファイルの検証は v2.1.233 以降):skills・agents・commands という名前のディレクトリは中のファイル、.claude という名前のディレクトリはその中の skills・agents・commands、それ以外のディレクトリはその下の .claude にある3つのディレクトリ

ディレクトリが .claude-plugin/marketplace.json と .claude-plugin/plugin.json の両方を持つときは、Claude Code はマーケットプレイスに加えて、プラグインのマニフェストとコンポーネントのファイルも検証します。v2.1.289 以降です。

Claude Code は、名前を渡したディレクトリの中のシンボリックリンクを辿りません。動作はリンクの場所で変わります。

  • プラグインか .claude のルートの下の、リンクになった skills・agents・commands ディレクトリ:中は何も読まれなかったと警告する
  • skills・agents・commands ディレクトリの中の、リンクになった項目:飛ばして、セッションが読み込むはずだった数を、ディレクトリごとに警告する
  • 渡した skills・agents・commands ディレクトリ自身、またはその親の .claude がシンボリックリンク:エラーを報告し、中は何も確認しない。実際のディレクトリを渡す

検証が読まないファイルがあります。プラグインのルートの SKILL.md(プラグインのディレクトリに対する実行では確認されない)、プラグインのルートの CLAUDE.md(プラグインの実行では警告される)、マーケットプレイスの実行でのプラグインのファイル(マーケットプレイスのディレクトリからは、マーケットプレイスが別のディレクトリに載せたプラグインのスキル・エージェント・コマンド・フックのファイルや、同梱の MCP サーバーのファイルを開かない。これらのファイルのエラーを見つけるには、各プラグインのディレクトリを検証する)です。ファイル、パスつきのエラーと警告、判定の行を出し、終了コードは判定に従います。

終了コード 判定の行 意味
0 Validation passed か Validation passed with warnings マニフェストが読み込める。--strict では、警告も無い
1 Validation failed か Validation failed (--strict treats warnings as errors) エラー、または --strict での警告
2 Unexpected error during validation: <reason> 読めないパスなど、検証器自身の失敗

--json では、レポートを標準出力に、次のトップレベルのフィールドを持つ1つの JSON オブジェクトとして書きます。

  • success:終了コードと同じ判定
  • strict:警告をエラーとして扱った実行か
  • target:Claude Code が検証した、解決後のパス
  • manifest:マニフェスト自体の結果。マニフェストなしの実行では null
  • contents:ファイルごとの結果。それぞれ file と、errors・warnings・notes の配列を持つ

終了コード 2 のときは、標準出力には何も書かず、エラーメッセージは標準エラーに出ます。

plugin marketplace add#

GitHub リポジトリ・git の URL・ホストした marketplace.json・ローカルのパスからマーケットプレイスを追加し、設定ファイルに宣言します。追加後、Claude Code は、入れたプラグインが欠いていた依存を入れます。

bash
claude plugin marketplace add <source> [options]
claude plugin marketplace add your-org/your-marketplace --scope project
フラグ 内容
--scope <scope> マーケットプレイスを宣言する設定ファイル。user・project・local。既定は user
--sparse <paths...> モノレポ向けに、git のチェックアウトをこれらのディレクトリに限る。github と git の取得元だけ
--claudeai 引数を、取得元ではなく、claude.ai がホストするマーケットプレイスの名前として読む。v2.1.273 以降

<source> の形で、取得元の種類と、Claude Code のマーケットプレイスの取得方法が決まります。

入力 取得元の種類 取得方法
owner/repo・owner/repo#ref・owner/repo@ref github GitHub リポジトリを clone する。ref があればそれに固定。オーナーとリポジトリは GitHub の命名規則に従う必要がある
user@host:path[.git][#ref] git SSH で clone する
.git[#ref] で終わるか /_git/ を含む http:// か https:// の URL(https://example.com/repo.git など) git その URL を clone する。Azure DevOps の URL も含む
https://github.com/owner/repo か https://gitlab.com/namespace/project、または http:// の同じもの git .git を足して clone する
それ以外の http:// か https:// の URL(.git のない自前の git ホストを含む) url URL を marketplace.json として取得する。そこのリポジトリを clone するなら .git を足す
ディレクトリへの ./path・../path・/path・~/path directory ディレクトリをその場で読む。Windows では .\・..\・C:\ の形も使える
.json ファイルへの同じパスの形 file ファイルをその場で読む

clone の URL に .git の接尾辞が付かないホスト(AWS CodeCommit など)は、代わりに extraKnownMarketplaces の git の項目としてマーケットプレイスを追加します。Claude Code は、gitlab.com の入れ子のサブグループつきの URL(https://gitlab.com/group/subgroup/project)も clone します。

成功すると、マーケットプレイス自身のマニフェストの name を使って、Successfully added marketplace: your-marketplace (declared in project settings) と出ます。同じものを追加し直すか、取得元が不正なときは、次の結果になります。

状況 出力と終了コード
マーケットプレイスがすでにディスクにある Marketplace 'your-marketplace' already on disk — declared in project settings、終了コード 0
取得元を認識できない Invalid marketplace source format. Try: owner/repo, https://..., or ./path、終了コード 1
gitlab.example.com/team/plugins のような裸のホスト 不正な owner/repo の略記として失敗し、https:// を足すかローカルのパスを使うよう案内する

claude.ai がホストするマーケットプレイスは、claude plugin marketplace list の From claude.ai: の節に出る名前で追加します(claude plugin marketplace add --claudeai claudeai-organization-library)。--claudeai は --scope と --sparse を拒否します。そのマーケットプレイスはアカウントのためにホストされ、設定ファイルに宣言されないので、プロジェクトの .claude/settings.json では共有できません。

plugin marketplace list#

追加したマーケットプレイスを、取得元とともに一覧にします。--json で、一覧を JSON として出します。Configured marketplaces: と、マーケットプレイスごとの Source: の行を出し、無いと No marketplaces configured と出します。--json では、マーケットプレイスごとに1つのオブジェクトの配列を出し、各フィールドは文字列です。

フィールド 内容
name マーケットプレイスの名前
source github・git・url・directory・file・claudeai
repo owner/repo。github の取得元だけ
url clone か取得の URL。git と url の取得元だけ
path ローカルのパス。directory と file の取得元だけ
ref 固定したブランチかタグ。固定したときだけの github と git の取得元
installLocation Claude Code がマーケットプレイスをキャッシュした場所

追加した claude.ai のマーケットプレイスにはローカルの clone が無いので、installLocation の代わりに、claude.ai の識別子の marketplaceId と organizationUuid を持ちます。記録があれば scope、そして status も持ちます。端末のセッションがプラグインを claude.ai のアカウントから同期していると、テキストの一覧は From claude.ai: の節で終わります(v2.1.273 以降)。claude.ai がアカウントについて出す、まだ追加していないマーケットプレイス(git ベースのものとホストされたもの)を並べます。--json の出力は、設定済みのマーケットプレイスだけを含み、この節は含みません。

plugin marketplace remove#

マーケットプレイスの宣言を設定から外します(別名 rm)。

bash
claude plugin marketplace remove <name> [options]
claude plugin marketplace remove your-marketplace

<name> は、add に渡した取得元でなく、plugin marketplace list が示すマーケットプレイスの名前です。

フラグ 内容
--scope <scope> 1つの設定スコープ(user・project・local)から宣言を外す。無ければ、すべてのスコープから宣言を外す

注意

マーケットプレイスを、それを宣言する最後のスコープから外すと、キャッシュも消え、そこから入れたプラグインはすべてアンインストールされ、保存済みのオプションとシークレットとデータも、可能な範囲で消えます。プラグインを失わずにマーケットプレイスを更新するには、plugin marketplace update を使います。

成功すると Successfully removed marketplace: your-marketplace と出ます。コマンドがプラグインをアンインストールしたときは、Also uninstalled 2 plugins from this marketplace: のような行の下に並べます。宣言していない設定ファイルに --scope を向けると、Marketplace 'your-marketplace' is not declared in project settings. Omit --scope to remove it from all scopes. で失敗します。

plugin marketplace update#

1つか全部のマーケットプレイスを取得元から更新し、新しいプラグインと版を取得します。ブランチかタグの ref つきで追加したマーケットプレイスは、リポジトリの既定ブランチではなく、その ref の最新のコミットに更新されます。--help 以外のフラグはありません。

bash
claude plugin marketplace update [name]

成功すると Successfully updated marketplace: your-marketplace と出ます。名前を省くと Successfully updated 2 marketplaces のように数が出ます。マーケットプレイスが1つも追加されていないと No marketplaces configured と出て 0 で終了します。

セッション内のコマンド#

/plugin#

対話セッションでは、/plugin がプラグインのパネルを開きます。各サブコマンドは、パネルをタブで開く、そこで操作を実行する、結果をその場に出す、のどれかです。/plugins と /marketplace は /plugin の別名です。対話の端末のセッションでだけ実行でき、claude -p のような非対話の実行では、/plugin が使えないと返ります。<plugin> はプラグインの name か name@marketplace です。init・update・details・prune・eval・eval init・test には、セッション内の形がありません。

コマンド 別名 動作
/plugin パネルを「Discover」タブで開く。/plugin のあとの未知の最初の語も同じ
/plugin help /plugin --help・/plugin -h /plugin のサブコマンドの使い方の一覧を出す
/plugin list [--enabled|--disabled] ls マーケットプレイスから入れたプラグインを、版・スコープ・状態とともにその場に出す。絞り込みのフラグは、その状態のものだけを出す。有効の状態がまだ適用されていないプラグインには — run /reload-plugins to apply が付く
/plugin install i 「Discover」タブを開く
/plugin install <plugin> i プラグインの詳細を「Discover」タブで開く。name@marketplace なら、そのマーケットプレイスの一覧で開く
/plugin install <source> i 対象がパス・URL・owner/repo のとき、追加済みの取得元でも、Marketplace not found のエラーを報告し、何もインストールしない
/plugin install <plugin> --marketplace <source> i <source> のマーケットプレイスを、まだ追加していなければ、確認してから追加し、プラグインの詳細を開く(v2.1.275 以降)
/plugin manage 「Installed」タブを開く
/plugin stats /skill-doctor が使えるセッションでは「Stats」タブを開く。それ以外では、パネルを「Discover」タブで開く
/plugin enable <plugin> 「Installed」タブのそのプラグインで開き、有効にする
/plugin disable <plugin> 「Installed」タブのそのプラグインで開き、無効にする
/plugin uninstall <plugin> 「Installed」タブのそのプラグインで開き、アンインストールする
/plugin configure <plugin> config プラグインの userConfig のダイアログを開くか、無いと報告する
/plugin validate <path> claude plugin validate と同じレポートをその場に出す
/plugin tag [path] [--push] [--dry-run] [--force] claude plugin tag と同じようにリリースのタグを作る。--push・--dry-run・--force(か -f)を受け、他のフラグや余分な引数があると使い方を出す
/plugin marketplace market 何も見える動作をしない。add・list・update・remove を渡す
/plugin marketplace add [source] market add 取得元があれば追加して結果を報告し、無ければ「Add marketplace」の入力を開く
/plugin marketplace list market list マーケットプレイスの名前をその場に出す
/plugin marketplace update [name] market update 「Marketplaces」タブを開く。名前があれば、そこでそのマーケットプレイスを更新する
/plugin marketplace remove [name] market remove・market rm・marketplace rm 「Marketplaces」タブを開く。名前があれば、そこでそのマーケットプレイスを外す

/plugin enable・disable・uninstall・configure で、現在のプロジェクトに入っていないプラグインを指すと、操作せずに Plugin "<plugin>" is not installed in this project と出ます。

/reload-plugins#

実行中のセッションを再起動せずに、保留中のプラグインの変更を反映します。保留中の変更とは、セッションの開始以降に、入れた・更新した・有効にした・無効にした・ディスクで編集したプラグインです。/plugin のパネルで変更して閉じるときは、Claude Code が /reload-plugins を代わりに実行します。別の端末で動かした claude plugin コマンドのような、パネル外の変更のあとは自分で実行します。

text
/reload-plugins [--force]

--force は、プロンプトキャッシュが無効になるときでもリロードを適用します(ダッシュなしの force も使えます)。

Claude Code は有効なプラグインをすべてリロードし、Reloaded: N plugins · N skills · N agents · N hooks · N plugin MCP servers · N plugin LSP servers という要約を1行出します(対話端末のないセッションでは、プラグインの MCP サーバーの数は省かれます)。プラグインが失敗していれば、要約に N errors during load. Run /plugin for details. が足されます。スキルの数には、プラグインが提供するスキル(commands/ の項目と SKILL.md のスキルの両方)が数えられます。エージェントの数は、セッションに読み込まれたエージェントの数で、プラグイン由来でないものも含みます。リロードされたプラグインの依存が欠けていると、Claude Code はそれを入れて再度リロードし、要約に (+ N dependencies: <names>) resolved を足します。

リロードがプラグインの MCP サーバーか LSP ツールを足すか外すことになり、その変更がプロンプトキャッシュを無効にするときは、Claude Code はリロードを適用せず、This reload changes MCP tools (<server>) — your next message will re-read the whole conversation instead of using the cache. Run /reload-plugins --force to apply. のような行を出します。--force で適用します。/reload-plugins は、デスクトップアプリ・Agent SDK・-p の非対話モードのような、対話端末のないセッションでも動きます(v2.1.260 以降)。ただし、セッション自身に自分で打ち込んだときだけで、リモートコントロールや Slack から中継されたメッセージで届いたときは、/reload-plugins isn't available over a remote connection in this session. と返して何もリロードしません。そうしたセッションのリロードは、プラグインの MCP サーバーを接続も切断もせず、その変更は次のセッションで効きます。

1セッションだけ読み込むフラグ#

次の2つの claude のフラグは、インストールせずに、1セッションだけプラグインを読み込みます。どちらも繰り返せます。プラグインの作者が、公開前に試すために使います(プラグインを作って配る)。

フラグ 内容 例
--plugin-dir <path> ディレクトリか、その .zip からプラグインを読み込む。プラグインのフォルダを渡すと、.claude-plugin/plugin.json を持つ各子フォルダを読み込む。フラグ1つにつきパス1つ claude --plugin-dir ./my-plugin --plugin-dir ./other.zip
--plugin-url <url> URL から、プラグインの .zip を取得する。フラグを繰り返すか、複数の URL を、引用符で囲んだ1つの値に空白で区切って渡す claude --plugin-url "https://example.com/a.zip https://example.com/b.zip"

どちらかのフラグが読み込んだプラグインは、セッション限りのプラグインです。claude plugin list が表示するのは、claude --plugin-dir ./my-plugin plugin list のように、同じフラグがサブコマンドの前にあるときだけです。プラグインは Session-only plugins で始まる見出しの下に <name>@inline として出て、--json はその scope を session と報告します。セッション限りのプラグインが入れたプラグインと同じ名前のとき、そのセッションではセッション限りのコピーを読み込み、入れたものは飛ばします。セッション限りのコピーを claude plugin disable <name>@inline で無効にしたとき、または管理設定がそのプラグイン名をロックしているときは、入れたコピーが代わりに読み込まれます。管理者は、管理設定の disableSideloadFlags で、2つのフラグと CLAUDE_CODE_PLUGIN_DIRS のフォルダを拒否できます(その場合、フラグが組織の管理設定で無効だと出して、1 で起動せずに終了します)。Agent SDK では plugins オプションが --plugin-dir に当たります。

読み込みの規則#

プラグインがどこから読み込まれ、どの設定ファイルが読み込みを決め、なぜ更新が何も変えなかったのかを辿るための規則です。セッションの開始時と、/reload-plugins を実行するたびに適用されます。

3つの段階#

enabledPlugins の項目は、段階を経て使えるプラグインになります。設定が宣言し、Claude Code がディスクへ取得し、動いているセッションが読み込みます。設定ファイルから想像した動作にならないときは、どの段階まで進んだかを確かめます。

段階 内容
宣言(設定) enabledPlugins がどのプラグインをオンにするか、extraKnownMarketplaces がどのマーケットプレイスがあるべきかを示す。claude plugin marketplace add は、マーケットプレイスをディスクだけでなく、ユーザー設定の extraKnownMarketplaces にも書く
取得(ディスク、~/.claude/plugins/ の下) Claude Code が取得したものの記録と、取得したファイル。known_marketplaces.json は取得した各マーケットプレイスを source・installLocation・lastUpdated・autoUpdate とともに記録する(ユーザーごとに1つなので、1つのプロジェクトで追加したマーケットプレイスはどのプロジェクトでも使える)。installed_plugins.json は各インストールを scope・installPath・version とともに記録する。cache/ がプラグインのファイルを持つ
読み込み(動いているセッション) 起動時か、最後の /reload-plugins で読み込んだプラグインの集合。設定やディスクの変更は、/reload-plugins を実行するか、新しいセッションを始めるまで、この層に届かない。そのため claude plugin update は Restart to apply changes. で終わり、背景の更新は Run /reload-plugins to apply と促す

プラグインは、セッションの開始時に、installed_plugins.json とキャッシュから、ネットワークを使わずに読み込まれます。セッションの開始後に、Claude Code は宣言されたマーケットプレイスを背景で確認します。

  • 設定が宣言していて known_marketplaces.json に無いマーケットプレイス:clone し、プラグインを再読み込みして、まだキャッシュされていない有効なプラグインをダウンロードする
  • 取得元が設定で変わった、宣言済みのマーケットプレイス:新しい取得元から再取得し、Plugins changed. Run /reload-plugins to activate. と出す

どちらの経路も取得せず、使えるキャッシュのディレクトリも無い有効なプラグインは、/plugin の「Errors」タブに Plugin "<name>" not cached at <path> と出し、claude plugin list は同じ行に — run /plugin to refresh を足します。

プラグインの出どころ(ID)#

プラグインにはすべて <name>@<origin> の形の ID があり、設定ファイルと claude plugin list --json に出ます。@ の後ろが、Claude Code がプラグインを見つけた場所です。

ID の末尾 プラグインが来た経路 オンとオフの切り替え
@<marketplace> 追加したマーケットプレイスから入れた 設定ファイルの enabledPlugins の "<name>@<marketplace>": true か false
@inline --plugin-dir か --plugin-url で起動した、CLAUDE_CODE_PLUGIN_DIRS を設定した、または Agent SDK アプリが plugins オプションを渡した。そのセッションだけで読み込まれる マニフェストが defaultEnabled: false を設定するか、設定ファイルが "<name>@inline": false を設定しない限り、セッションでオン
@skills-dir .claude-plugin/plugin.json を持つプラグインのディレクトリを、~/.claude/skills/ かプロジェクトの .claude/skills/ に置いた マニフェストの defaultEnabled。設定ファイルが "<name>@skills-dir" を true か false に設定していればそれ
@synced 自分か組織が claude.ai のアカウントでオンにし、Claude Code が同期してダウンロードした マニフェストが defaultEnabled: false を設定するか、設定ファイルが "<name>@synced": false を設定しない限りオン。組織が必須にしたプラグインは、かかわらず読み込まれる

マーケットプレイスのプラグインでは、<name> は marketplace.json の項目の名前で、@inline と @skills-dir ではプラグインのマニフェストの name です。この表の出どころの名前は予約済みなので、inline・skills-dir・synced という名前のマーケットプレイスは作れません。マーケットプレイスのプラグインには、違うことがある2つの名前があります。

  • marketplace.json の項目の名前:インストールと有効化のキー。enabledPlugins に書くもの、キャッシュのディレクトリの名前の元、claude plugin list が表示するもの
  • マニフェストの name:プラグインのコンポーネントの名前空間になるもの、名前の衝突が比べるもの

リポジトリで共有するプラグイン#

リポジトリを通じてプラグインを共有するには、.claude/settings.json の enabledPlugins に並べるか、.claude/skills/ の下に置きます。Claude Code は、プロジェクトの .claude/plugins/ ディレクトリを走査しません。クラウドセッションは、リポジトリが extraKnownMarketplaces に並べたマーケットプレイスを追加しません(それにはワークスペースの信頼のダイアログが要り、クラウドセッションはそれを出さないため)。

プロジェクトスコープのスキルのディレクトリのプラグインは、セッションの主作業ディレクトリの .claude/skills/ からだけ、そのフォルダのワークスペースの信頼ダイアログを承認したあとにだけ読み込まれます。普通のスキルやコマンドのように、リポジトリのルートまで親ディレクトリを探すことはありません。サブディレクトリから起動すると、リポジトリのルートのプラグインは読み込まれません。ルートから起動するか、/cd でセッションをそこへ移します(v2.1.246 以降)。

プロジェクトスコープのプラグインは、リポジトリにチェックインされ、クローンした全員に届きます。内容が自分でなくリポジトリから来るので、.claude/settings.json のプロジェクトの許可ルールと同じ信頼の確認を通ったあとにだけ読み込まれます。親フォルダを信頼している、-p で実行している、は十分ではありません。コードを動かすコンポーネントには、さらに制限があります。

  • 宣言する MCP サーバー:プロジェクトの .mcp.json と同じサーバーごとの承認を通る
  • MCP バンドル(.mcpb か .dxt のファイル)として、またはプラグインのディレクトリの外のファイルから宣言した MCP サーバー:飛ばされる。インラインか、プラグインのディレクトリの中の .mcp.json で宣言する
  • 背景のモニター:読み込まれない

個人スコープのプラグインには、これらの制限はありません。

claude.ai から同期されたプラグイン#

claude.ai のアカウントでオンにしたプラグイン(組織がメンバーにオンにしたものを含む)は、マーケットプレイスから入れたプラグインと並んで、Claude Code でも読み込まれます。それぞれ <name>@synced として、マーケットプレイスもインストールの記録もなしで読み込まれます。端末のセッションでは、同期されたプラグインのスキル・エージェント・フック・MCP サーバー・LSP サーバーがすべて読み込まれ、自分で入れたマーケットプレイスのプラグインと同じ信頼で扱われます(Cowork が読み込むコンポーネントは、claude.com の対応表にあります)。

  • Cowork:セッションの開始時に、Claude Code がセッション自身の環境へダウンロードする
  • 端末のセッション:Claude Code を起動するたびに、背景で1回同期し、新しいものと更新されたものをダウンロードし、自分や組織がオフにしたものを外す。端末での同期は v2.1.273 以降

端末の同期は背景で動くので、セッションの開始後に終わることがあります。対話のセッションで同期が同期されたプラグインを追加・更新・削除すると、Plugins changed. Run /reload-plugins to activate. と出ます。/reload-plugins でそのセッションに反映するか、次の起動まで待ちます。セッションの実行中に claude.ai でプラグインを有効にしたときは、次に Claude Code を起動するときにダウンロードされます。端末で同期されるのは、claude.ai のアカウントでサインインしたセッションだけです。次の端末のセッションでは、/login でサインインしても、同期されたプラグインはダウンロードも読み込みもされません。

  • ANTHROPIC_AUTH_TOKEN・CLAUDE_CODE_OAUTH_TOKEN・apiKeyHelper のスクリプトが、そのサインインの代わりに資格情報を与えるセッション
  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC を設定したセッションのように、Anthropic から機能フラグを取得しないセッション
  • bare モード、または --safe-mode で始めたセッション
  • user を除いた --setting-sources のリストで始めたセッション

以前の版の Claude Code でサインインした場合、そのサインインは、Claude Code が背景で更新するまで、プラグインを覆いません。早く使うには、/login をもう一度実行します(同期は、次に Claude Code を起動したときに始まる)。同期されたプラグインは、1つずつオフにできます(組織が必須にしたものを除く)。マシンの全同期プラグインをオフにすることもできます。

  • 1つ:シェルの claude plugin disable <name>@synced と、セッションの /plugin の「Installed」タブが、どちらもユーザーレベルの enabledPlugins に "<name>@synced": false を保存する。すべての環境でプロジェクトから外すには、プロジェクトのコミットされた .claude/settings.json に同じキーを設定する
  • マシンのすべて:ユーザー設定で syncClaudeAiPlugins を false にする(組織が管理設定で設定してもよい)。Claude Code はダウンロードを止め、次の起動時に、すでに同期したプラグインを ~/.claude/plugins/.trash/ へ移して、読み込まなくなる。組織が claude.ai でスキルをオフにしたときも、プラグインは同期されなくなる
  • 組織が必須にしたプラグイン:claude.ai で組織が必須にしたプラグインは、前に無効にしていても読み込まれる。claude plugin disable は Plugin "<name>@synced" is required by your organization and can't be disabled here. Contact your admin to change it. で拒否し、claude plugin list はそれに required by your org と付ける

どこで有効になっているか#

enabledPlugins の項目は、6つの出どころのどれにでも設定できます。次の表は、優先度が低いものから高いものの順に、各出どころが誰に適用されるかを示します。

出どころ 設定する場所 届く範囲
--add-dir --add-dir で渡したディレクトリの .claude/settings.json か .claude/settings.local.json このセッションだけ。true の値だけが効き、他のどの出どころもこれを上書きする
user ~/.claude/settings.json 自分、全プロジェクト
project .claude/settings.json リポジトリをクローンした全員
local .claude/settings.local.json 自分、このリポジトリだけ
flag 起動時に渡す --settings の値 このセッションだけ
managed 管理設定 ポリシーが適用される全ユーザー。true は強制的に有効、false はブロックで、他のどの出どころもこれを上書きできない

これらの出どころは、キーごとにマージされます。各プラグイン ID で、適用される値は、その ID に言及する最も優先度の高い出どころの値です。ID に言及しない出どころは、優先度の低い出どころの値をそのままにします。

  • ユーザー設定で無効にしたのに読み込まれる:~/.claude/settings.json で false にしたプラグインが読み込まれるなら、優先度の高い出どころの true が上書きしている。claude plugin list と /plugin の行に Disabled in ~/.claude/settings.json but still loads — project settings enable it, which overrides your user setting と出る。メッセージが、上書きした出どころを名指しする(project、.claude/settings.local.json の project, gitignored、cli flag、managed)。自分のマシンでプロジェクトが有効にしたプラグインから外れるには、プロジェクトのファイルより優先度が高い .claude/settings.local.json で、その ID を false にする
  • プロジェクトの設定で有効だが入っていない:プラグインの唯一の true がプロジェクトの .claude/settings.json にあるとき、そのマーケットプレイスの項目が相対パスの取得元を持つか、種のディレクトリがすでに持っていない限り、Claude Code は、入っていないマシンに取得しない。代わりに、/plugin の「Errors」タブに Plugin "<name>" is enabled in project settings but isn't installed here と出る。相対パスのプラグインは、マーケットプレイス自体から読み込まれるので、インストールの記録が要らない。Claude Code が外部の取得元のプラグインを取得するのは、次のどれかが true に設定するときだけ:自分のユーザー設定、git が追跡しない .claude/settings.local.json、--settings フラグ、管理設定

ディスク上の場所#

Claude Code は、プラグインのファイルと状態の記録を、1つのプラグインのルート(CLAUDE_CODE_PLUGIN_CACHE_DIR を設定しない限り ~/.claude/plugins)の下に置きます。表のパスはすべてそのルートからの相対です。

パス 内容
cache/<marketplace>/<plugin>/<version>/ マーケットプレイスのプラグインの、入れた版ごとに1ディレクトリ。<plugin> はマーケットプレイスの項目の名前、<version> は解決された版。${CLAUDE_PLUGIN_ROOT} がこのディレクトリを指す
data/<plugin-id>/ プラグインの永続ディレクトリで、${CLAUDE_PLUGIN_DATA} として公開される。プラグインのコンポーネントが最初に使ったときに作られ、更新をまたいで残る。既定では、最後のスコープからプラグインを外すときに消える(--keep-data などで残る場合は plugin uninstall)
marketplaces/<name>/ GitHub・他の Git ホスト・URL から追加したマーケットプレイスの clone かダウンロード。ローカルの file か directory の取得元から追加したものはここにコピーが無く、known_marketplaces.json の installLocation が渡したパスになる
synced/ claude.ai のアカウントから Claude Code が同期したプラグイン
.trash/ claude.ai の同期が外したプラグイン(claude.ai でオフにした、または同期をやめたときなど)
installed_plugins.json と known_marketplaces.json 入れたものと、取得したマーケットプレイスの記録。claude.ai がホストするマーケットプレイスは、代わりに known_marketplaces_claudeai.json に記録される
flagged-plugins.json マーケットプレイスが掲載を外したために Claude Code がアンインストールしたプラグイン。/plugin の「Flagged」の節に出る
installed_plugins.set-aside.<date>.<hash>.json と installed_plugins.unreadable.<date>.<hash>.kept どの版の Claude Code も使えないインストールの記録を落とす、または読めない installed_plugins.json を作り直す前に、Claude Code が残す日付付きのコピー。cleanupPeriodDays の予定で消える

${CLAUDE_PLUGIN_ROOT} は版のディレクトリを指すので、プラグインのルートのパスは版ごとに変わります。長持ちするファイルは、代わりに ${CLAUDE_PLUGIN_DATA} に置きます。

その場で読み込むものとコピーするもの#

Claude Code は、出どころに応じて、一部のプラグインを置き場所からその場で読み込み、残りをキャッシュにコピーします。

  • --plugin-dir とスキルのディレクトリのプラグイン:ディレクトリをその場で読み込み、コピーしない。--plugin-url のアーカイブや --plugin-dir の .zip は、先にセッションの一時ディレクトリへ展開される
  • ローカルのパスから追加したマーケットプレイスの、相対パスのプラグイン:マーケットプレイスのフォルダ内のパスからその場で読み込む。ソースのディレクトリの編集は、次のセッション開始か /reload-plugins で反映され、版を上げる必要はない。プラグインのフックのプロセスと MCP・LSP サーバーは、ソースのディレクトリを指す CLAUDE_PLUGIN_ROOT を受け取る
  • link モードの command の取得元のプラグイン:コマンドが出力したディレクトリを、キャッシュの項目のリンク経由でその場で読み込む
  • それ以外のマーケットプレイスのプラグイン:インストール時にプラグインを cache/<marketplace>/<plugin>/<version>/ へコピーし、そのコピーを読み込む。プラグインのディレクトリの外のファイルはコピーされないので、コピーされたプラグインの中のスクリプトが ../shared のようなプラグインのルートの上のパスを読むと、見つからない

どれもプラグインのディレクトリの外にコンポーネントを宣言させません。plugin.json かマーケットプレイスの項目のどちらで宣言されたパスでも、プラグインのルートの外に解決されるものを拒否します。

  • 書いたとおりにプラグインの外を指すパス:../shared-utils など
  • プラグインの外へ向かうシンボリックリンク:同じマーケットプレイスのプラグイン間のリンクを除く
  • macOS と Linux で、パスのどこかにバックスラッシュを含むもの:パスがプラグインの内側にとどまっていても。そのため、バックスラッシュのパスで宣言したコンポーネントは Windows でだけ読み込まれる。./commands/deploy.md のように、スラッシュで書く

拒否されたパスは path escapes plugin directory のエラーになり、プラグインはそのコンポーネントなしで読み込まれます。

プラグインを更新するかアンインストールすると、Claude Code は前の版のディレクトリに .orphaned_at の印を書き、14日後の背景の掃除で消します(すでに古い版を読み込んだセッションは動き続けられる)。掃除は、installed_plugins.json が少なくとも1つのインストールを記録しているあいだだけ動きます。最後のプラグインをアンインストールしたあと、孤立したディレクトリは、次に何か入れるまで残ります。

Node.js のパッケージ依存#

Claude Code は、プラグインをキャッシュへコピーするとき、プラグインの Node.js のパッケージ依存もそこへ入れるので、プラグインのフックと MCP サーバーがそれを読み込めます。これは、プラグイン自身の package.json が宣言する npm と Bun のパッケージのことで、他のプラグインへの依存の版はプラグインを作って配るにあります。Claude Code は、版のディレクトリを作るたびに、そのコピー先へ依存をインストールします。

  • プラグインを入れるとき
  • Claude Code がプラグインを新しい版に更新するとき
  • 新しいマシンのように、有効なプラグインがまだキャッシュされていないセッションの開始時

ローカルのパスから追加したマーケットプレイスからその場で読み込む相対パスのプラグインでは、ソースのディレクトリへの依存のインストールは行われません。自分でそこに入れるか、フックで ${CLAUDE_PLUGIN_DATA} に入れます。インストールは、プラグインのルートのディレクトリが package.json と対応するロックファイルの両方を持つときだけ動きます。

ロックファイルが、Claude Code が動かすパッケージマネージャーを決めます。

ロックファイル パッケージマネージャー
bun.lock Bun
npm-shrinkwrap.json か package-lock.json npm

プラグインが複数のロックファイルを含むときは、bun.lock・npm-shrinkwrap.json・package-lock.json の順に確認して、最初に合ったものを使います。

次のロックファイルでは、インストールを飛ばします。

  • bun.lockb:Bun のバイナリのロックファイルは検査できない。テキストの bun.lock か npm のロックファイルを同梱する
  • yarn.lock か pnpm-lock.yaml:npm のロックファイルに置き換える
  • Claude Code が読めない形式のロックファイル:npm のロックファイルは lockfileVersion が 2 か 3(npm 7 以降が書く)、bun.lock は lockfileVersion が 2 以下であること

最も多くのユーザーに届けるには、npm のロックファイルを含めます。Claude Code は合ったロックファイルのパッケージマネージャーをユーザーの PATH から動かし、それが無くても他のロックファイルを試しません。npm の取得元で配るプラグインには、npm-shrinkwrap.json を使います(npm が package-lock.json を公開パッケージから除くため)。

このインストールは、プラグインやそのパッケージのコードが動かないように制約され、時間も制限されます。

  • レジストリのパッケージだけ:すべての依存が、ロックファイルで正確な版に固定されたレジストリのパッケージであること。git・GitHub・フォルダ・ワークスペース・リンクの依存を持つプラグインは、インストールされない
  • https のダウンロード:ロックファイルのダウンロードのリンクは、インストールするユーザー自身の既定の npm レジストリを指すときを除き、https であること
  • 別のインストール用フォルダ:パッケージマネージャーは、検査済みの依存の一覧のコピーだけを置いた専用のフォルダで動く。そのため npm と Bun は、プラグインの .npmrc・.env・bunfig.toml を読まない。インストールが成功すると、できた node_modules をプラグインへ移す
  • 固定した解決:ロックファイルが固定した版をそのままインストールし、package.json とロックファイルが同じ依存を並べていなければ飛ばす
  • ライフサイクルスクリプトなし:--ignore-scripts で、preinstall・install・postinstall を動かさないので、それらのスクリプトでネイティブモジュールをビルドする依存は、ダウンロードされてもコンパイルされない
  • 上書きとパッチなし:package.json に npm の overrides があるプラグインは npm のロックファイルからインストールされず、Bun の patchedDependencies があるプラグインは bun.lock からインストールされない
  • 60秒のタイムアウト:それより長いインストールは止めて失敗として扱う

自動のインストールは止められません。無効にする設定や環境変数はありません。制限されたネットワークでは、許可するホストはネットワークの文書にあります(ネットワークと LLM ゲートウェイ)。

インストールが失敗するか飛ばされても、プラグインは読み込まれますが、足りないパッケージを要る部分は動かないことがあります。

/plugin と claude plugin list は、有効なプラグインのキャッシュのコピーにロックファイルと実行時の依存を挙げた package.json があるのに node_modules が無いとき、注記を出します。注記は、インストールが終わらなかったのか、このプラグインでは実行できないのかを示します。それぞれの対処は、トラブルシューティングの「The packages it lists are not installed」にあります。

自動のインストールが依存を与えられないとき(ライフサイクルスクリプトでのビルドが要るパッケージ、Python の依存、Yarn や pnpm でロックしたプラグイン、git の依存のようなレジストリのパッケージでない依存)は、フックから永続データのディレクトリへインストールします。

版と更新#

プラグインの作者が新しいコミットを押したのに、claude plugin update が <name> is already at the latest version (<version>). と出すときは、Claude Code が計算するプラグインの版が変わっていないので、プラグインのディスク上のファイルは変わりません。Claude Code は、入れるすべてのプラグインの版を計算し、その版が更新の検出の仕組みです。claude plugin update と背景の自動更新は、版をもう一度計算し、installed_plugins.json が記録するものと一致すれば、キャッシュのコピーを置き換えません。自分で始めた更新は、そのコピーの終わっていない依存のインストールを再試行することがあります。版は、プラグインのキャッシュのディレクトリの名前にもなります。ローカルのパスから追加したマーケットプレイスからその場で読み込むプラグインは、版の文字列にかかわらず、セッションの開始のたびに現在のソースのファイルを読み込みます。claude.ai がホストするマーケットプレイスのプラグインは、claude.ai が記録する版がその版で、マニフェストの version は読まれません。

版は、マーケットプレイスの項目の取得元の種類で規則が決まり、command を除くすべての取得元で、次の順に決まります。

  1. プラグインのマニフェストの version フィールド
  2. 次に、マーケットプレイスの項目の version フィールド
  3. どちらも無いとき、取得元の種類から決まる
取得元の種類 version が設定されていないときの版
github・url・git-subdir 取得元のコミット SHA を12文字に短くしたもの。git-subdir の版には、サブディレクトリのパスのハッシュも付く
archive SHA-256 のダイジェストを12文字に短くしたもの。マーケットプレイスの項目の sha256 の固定、固定が無ければダウンロードしたファイルのダイジェスト
Git ホストのマーケットプレイス内の相対パス インストールしたディレクトリのコミット SHA
ローカルのディレクトリで、プラグインのディレクトリもマーケットプレイスも git リポジトリでないとき unknown
npm unknown

Claude Code は、~/.claude を git で管理しているときのような、インストール先のパスを囲むリポジトリからは版を取りません。command の取得元では、常にコマンドが出力したものから版を導き(ハッシュ12文字だけ、マニフェストが版を設定していれば <manifest version>-<hash>)、マーケットプレイスの項目の version は無視されます。マニフェストが優先なので、"version": "1.0.0" を固定したマニフェストは、作者が文字列を変えるまで、コミットをいくつ押しても、全ユーザーをキャッシュしたコピーのままにします。コミットを追わせるには、マニフェストと項目の両方から version を外します。

プラグインを入れるとき、Claude Code はマーケットプレイスのカタログのローカルのコピーで調べます。

プラグイン名 コマンド Claude Code が更新するもの
name@marketplace /plugin install か claude plugin install 名前の付いたマーケットプレイスを、調べる前に更新する
name だけ /plugin install 自動更新がオンのマーケットプレイスだけを、調べて見つからなかったあとに更新する
name だけ claude plugin install 何も更新しない。キャッシュしたカタログを更新せずに読む

name@marketplace のインストールの前の更新は、マーケットプレイスの自動更新の設定や DISABLE_AUTOUPDATER に依存しません。更新が失敗すると、インストールはキャッシュしたカタログから進み、claude plugin install は marketplace not refreshed と報告します。次のときは、name@marketplace のインストールの前の更新を飛ばします。

  • マーケットプレイスをローカルの file か directory の取得元から追加した、または settings の取得元で設定にインラインで定義している
  • 種のディレクトリがマーケットプレイスを提供している
  • 直前30秒以内に更新した
  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC を設定した
  • 管理設定がマーケットプレイスをブロックしている(その場合、Claude Code はインストールも拒否する)

自動更新は、対話セッションで、最初のメッセージを送ってから、最大10分のランダムな待ちのあと、自動更新がオンのすべてのマーケットプレイスを更新し、そこから入れたプラグインのディスク上のコピーを更新します。動いているセッションは読み込んだ版のままで、Plugin updated: <name> · Run /reload-plugins to apply と出ます。リロードするかにかかわらず、新しい版は次の起動で読み込まれます。マーケットプレイスが自動更新するかは、次のうち最初に設定されているものに従います。

  1. 設定ファイルの extraKnownMarketplaces の項目の autoUpdate
  2. known_marketplaces.json の項目の autoUpdate(/plugin の「Marketplaces」の「Enable auto-update」の切り替えが書く。設定ファイルも extraKnownMarketplaces でそのマーケットプレイスを宣言しているときは、切り替えが、その設定の項目にも autoUpdate を書く)
  3. 既定:claude-plugins-official のような Anthropic の公式のマーケットプレイスはオン、knowledge-work-plugins と first-party-plugins はオフ、claude.ai から追加したマーケットプレイスはオン、それ以外はすべてオフ

DISABLE_UPDATES=1・DISABLE_AUTOUPDATER=1・CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 を設定すると、更新の処理全体がオフになり、「Enable auto-update」の切り替えが隠れます(FORCE_AUTOUPDATE_PLUGINS=1 も設定しない限り)。自動更新は、マーケットプレイスの項目が headersHelper を宣言するプラグインも飛ばします。コピーしたプラグインがセッション中に更新されると、フックのコマンド・モニター・MCP サーバー・LSP サーバーは、前の版のパスを使い続けます。/reload-plugins を実行すると、フック・MCP サーバー・LSP サーバーが新しいパスに切り替わります。モニターはセッションの再起動が要ります。

command の取得元のプラグインは、自動更新の処理を待ちません。出力されたディレクトリは、コマンドを動かした時点のツールの状態を映すので、Claude Code は承認されたコマンドを、次のときにもう一度動かします。

  • プラグインを入れる・更新するたびに
  • 有効な command の取得元の各プラグインにつき、セッションごとに1回、セッションの開始の少しあとに背景で(マーケットプレイスの自動更新の設定や DISABLE_AUTOUPDATER に依存しない)
  • 有効なプラグインの入れた版がプラグインのキャッシュに無いとき、起動時か /reload-plugins で

CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC を設定すると、2つの背景の実行を飛ばします(明示的なインストールと更新は、その変数があってもコマンドを動かします)。コマンドのハッシュした出力が変わっていると、Claude Code は結果を新しい版として入れ、動いている対話セッションで再読み込みして、/reload-plugins が切り替えるのと同じコンポーネントを切り替えます。通知が出ます。その場で再読み込みするとセッションのプロンプトキャッシュが無効になるときは、代わりに /reload-plugins を実行するよう促し、キャッシュの費用を警告して、--force で再実行すると適用します。

名前の衝突#

別々の出どころの有効なプラグインがマニフェストの名前を共有するとき、次の順(優先度の高いものから)で、どれが読み込まれるかが決まります。

  1. 管理設定の enabledPlugins に、true か false で ID が現れるプラグイン。名前の部分が ID と一致するマニフェストの名前を持つ --plugin-dir のコピーは読み込まれず、--plugin-dir copy of "<name>" ignored: plugin is locked by managed settings と出る
  2. 有効な --plugin-dir・--plugin-url・CLAUDE_CODE_PLUGIN_DIRS のプラグイン。同名の、入れたマーケットプレイスのプラグインやスキルのディレクトリのプラグインを置き換える。入れたマーケットプレイスのプラグインは、黙って置き換えられ、claude plugin list はマーケットプレイスの行を(設定を映すので)有効のまま示し、--debug で起動したときに ~/.claude/debug/ の下へ書かれるログだけが Plugin "<name>" from --plugin-dir overrides installed version を記録する。スキルのディレクトリのプラグインは、/plugin の「Errors」タブに Not loaded — the name "<name>" is already taken by a session-only plugin (--plugin-dir / --plugin-url), which takes precedence の行が出て置き換えられる
  3. 入れたマーケットプレイスのプラグイン。同名のスキルのディレクトリのプラグインは、入れたプラグインを名指しする同じ Not loaded の行になる
  4. スキルのディレクトリのプラグイン。2つのあいだでは、~/.claude/skills/ のコピーが読み込まれ、プロジェクトの .claude/skills/ のコピーは、どのパスが覆ったかを示す行とともに落とされる
  5. claude.ai から同期されたプラグイン。他の出どころの有効なプラグインが名前に合うと、Claude Code はそちらを読み込み、同期されたコピーを読み込まれなかったものとして報告する。claude.ai のコピーを使うには、自分のコピーを無効にする

順序がマニフェストの名前を比べるので、マニフェストが "name": "hello-plugin" でもある hello@example-marketplace を、hello-plugin という名前の --plugin-dir のプラグインが置き換えます。--plugin-dir のプラグインが何も覆わないようにするため、または親のプロセスがフラグを渡すときにオフにするには、どの設定ファイルでも、その ID を false にします。マニフェストの名前が hello-plugin のプラグインなら、"enabledPlugins": {"hello-plugin@inline": false} です。無効なセッション限りのプラグインは何も覆わないので、代わりにマーケットプレイスかスキルのディレクトリのコピーが読み込まれます。

エラーとトラブルシューティング#

メッセージは、それを出す段階ごとに、実行したコマンドとは限らない見出しの下に載せています。たとえば、マーケットプレイスが無いためにインストールが失敗することがあるので、そのメッセージは「マーケットプレイスの追加」の節にあります。メッセージが名指しするプラグインやマーケットプレイスは、<name> のようなプレースホルダーで示します。その他のエラーの一覧はエラー一覧、一般的な切り分けはトラブルシューティングにあります。

/plugin が動く場所#

/plugin は、動いている Claude Code の端末セッションの中で打つコマンドで、対話のパネルを開きます。

メッセージと状況 原因と対処
/plugin isn't available in this environment パネルを描く端末が無いセッションで打った。claude -p の非対話モード・Agent SDK・デスクトップアプリの「Code」タブ・VS Code 拡張のパネル・claude.ai/code のブラウザ。VS Code 拡張のパネルでは、あとに何かを続けた /plugin の行(/plugin install <plugin>@<marketplace> など)だけがこの返事になり、/plugin か /plugins だけなら「Manage plugins」のダイアログが開く。いる画面から入れる(デスクトップアプリの「+」「Plugins」「Add plugin」、VS Code の「Plugins」タブ、クラウドセッションにはプラグインのブラウザが無い)。端末では、claude を起動して /plugin を打つか、シェルで claude plugin install <plugin>@<marketplace> を実行する。成功すると、/plugin は ✓ Installed <plugin>. で始まる要約を出し、claude plugin install は Successfully installed plugin: <plugin>@<marketplace> と出す
zsh: no such file or directory: /plugin(Bash では bash: /plugin: No such file or directory) /plugin ... をシェルのプロンプトで打った。Claude Code のセッションの中で打つコマンド。claude を起動して打つか、セッションなしなら claude plugin install <plugin>@<marketplace>
The term '/plugin' is not recognized as the name of a cmdlet PowerShell のプロンプトで /plugin ... を打った。同じ。claude を起動してそこで打つか、PowerShell で claude plugin install ... を実行する
claude: command not found(Windows では 'claude' is not recognized as the name of a cmdlet など) プラグインのコマンドが原因ではない。Claude Code が入っていないか、そのインストール先がこのシェルの PATH に無い。インストール後の command not found: claude の手順に従ってから、もう一度実行する
Unknown command: /<name>、または error: unknown command '<name>'・error: unknown option '<flag>' 存在しないコマンドの綴りを打った。下の表で本当のコマンドに置き換える

存在しない綴りと、使うべきコマンドは次のとおりです。

打ったもの Claude Code の返事 代わりに使うもの
claude plugin add <source> error: unknown command 'add' マーケットプレイスの追加は claude plugin marketplace add <source>、プラグインのインストールは claude plugin install <plugin>@<marketplace>
claude plugin install <plugin> --project error: unknown option '--project' claude plugin install <plugin>@<marketplace> --scope project
/install <plugin> Unknown command: /install /plugin install <plugin>@<marketplace>
/plugin add <source> /plugin のパネルが「Discover」タブで開く /plugin marketplace add <source>
取得元としての marketplace.anthropic.com Invalid marketplace source format. Try: owner/repo, https://..., or ./path 公式マーケットプレイスには anthropics/claude-plugins-official

間違って見えて動く綴りもあります。claude plugins は claude plugin の別名、claude plugin remove は claude plugin uninstall の別名、セッションの /plugins と /marketplace は /plugin と同じパネルを開きます。

マーケットプレイスの追加#

メッセージ 原因と対処
Marketplace "claude-plugins-official" not found 公式マーケットプレイスがこのマシンにまだ登録されていない。通常は、最初の対話の端末セッションの起動時に Claude Code が自分で登録する。VS Code 拡張だけを使ってきた場合はまだ動いていない。また、ポリシーが取得元をブロックしている、CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL が設定されている、再試行待ちの失敗した試みの後、は、その手順を飛ばすか後回しにする。claude plugin のシェルコマンドは登録しない。/plugin marketplace add anthropics/claude-plugins-official を実行してから、インストールをやり直す。ほかの名前は、次の行。設定が、追加していないマーケットプレイスを名指しするプラグインを持つとき、/plugin の「Errors」タブにも出る
Marketplace "<name>" not found /plugin install <plugin>@<name> が、追加していないマーケットプレイスを名指ししているか、/plugin install <source> にパス・URL・owner/repo を渡した(追加済みの取得元でも、インストールせずにこの報告になる。1コマンドでの導入は --marketplace)。名前が claudeai- で始まるなら claude.ai がホストするもので、claude plugin marketplace add --claudeai <name> で名前から追加する。それ以外は、インストールの行が取得元を示さず、Claude Code にはマーケットプレイス名を引く索引が無いので、行を送ってきた人に取得元(GitHub の owner/repo・git の URL・パス)を聞いて追加する。人から送られたマーケットプレイスはサードパーティなので、入れる前にプラグインを確認する。すでに追加したなら、/plugin marketplace list と綴りを比べる
Invalid marketplace source format 取得元が owner/repo・https:// か http:// の URL・user@host:path の SSH の URL・./・../・/・~ で始まるローカルのパスのどれでもない。claude-plugins-official のような名前だけや、marketplace.anthropic.com のような裸のホスト名はどれにも合わない。受け付ける形で書き直す
'<source>' is not a valid GitHub owner/repo shorthand スラッシュがあるが owner/repo でない取得元(github.com/owner/repo や gitlab.example.com/group/project)を渡した。owner/repo の略記は GitHub 専用で、GitHub の命名規則に従う。ホストに合う形で渡す:任意のホストのリポジトリは完全な clone URL、ホストした marketplace.json はその https:// の URL、ローカルのチェックアウトは ./path か絶対パス
Invalid git URL git のアドレスを Claude Code が git を動かす前に確認し、対応しないプロトコルのアドレスや、git が表示と別のサーバーやフォルダを指すと読みうるアドレスを拒否する。アドレスのあとのテキストが直す点を示す。is blocked by enterprise policy を言う拒否は組織の設定による
Path does not exist: <path> marketplace add に渡したローカルのパスに何も無い。相対パスは現在のディレクトリから解決される。メッセージの解決後のパスを確かめ、相対パスの起点のディレクトリから実行するか、マーケットプレイスのディレクトリの絶対パスを渡す。.claude-plugin/marketplace.json を持つディレクトリか .json ファイルへのパスが受け付けられ、それ以外のファイルは File path must point to a .json file (marketplace.json) で失敗する
Marketplace file not found at <path>/.claude-plugin/marketplace.json clone かダウンロードしたマーケットプレイスの中の期待したパスに marketplace.json が無い。Failed to add marketplace: Marketplace file not found at ... と報告される。所有者ならそのファイルを置いて追加し直す。他の人がホストしているなら、所有者が公開する正確な取得元を聞く
SSH authentication failed/HTTPS authentication failed(Failed to clone marketplace repository: に続く) まずリポジトリ自体を確かめる。綴りの間違い、存在しないリポジトリ、見えない非公開のリポジトリも同じメッセージで終わる。ブラウザで URL を開くか git ls-remote <url> で、存在とアクセスを確かめる。リポジトリが正しいなら、原因は資格情報。Claude Code は対話のプロンプトを切って git を動かすので、パスワード・鍵のパスフレーズ・資格情報を聞けない(聞く必要があるときの元のエラーは fatal: Cannot prompt because user interactivity has been disabled か terminal prompts disabled)。SSH は、ssh -T git@<host> がパスフレーズを聞かずに成功し、ホストが known_hosts にある必要がある。HTTPS は、資格情報ヘルパーがそのホストのトークンを持つ必要がある(GitHub なら gh auth login と gh auth setup-git。他のホストは個人アクセストークンを git の資格情報ヘルパーに保存する)。git ls-remote が端末でプロンプトなしで成功してから、追加か更新をやり直す。GitHub の owner/repo の取得元で SSH を使わせないには CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1 を設定する
SSH host key is not in your known_hosts file(鍵が変わったホストでは SSH host key has changed) 一度も接続していないホストから、SSH でマーケットプレイスを追加した。Claude Code は StrictHostKeyChecking=yes で clone するので、まだ受け入れていない鍵のホストを自動では受け入れずに拒否する。端末から一度接続して指紋を受け入れる(ssh -T git@github.com)。変わった鍵には ssh-keygen -R <host> のヒントが付く。公開リポジトリなら、SSH を避けて https:// の URL で追加する
Command 'git' not found or is in an unsafe location Windows で、Failed to clone marketplace repository: Command 'git' not found or is in an unsafe location (current directory) と出る。Claude Code は PATH の git を探し、カレントディレクトリでしか見つからないものは動かさない。Git for Windows を入れて PATH を通し、新しい端末を開き、git --version が版を出すことを確かめて、追加をやり直す
Git clone timed out after 120s clone と、更新のための clone し直しの、既定の待ちは120秒。大きなリポジトリや遅い回線では、CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS で上限を上げる(ミリ秒。export CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS=300000、PowerShell は $env:CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS = "300000")。同じシェルでやり直す。モノレポなら --sparse <paths> でチェックアウトを限る
オフラインでマーケットプレイスの更新が失敗し続ける マーケットプレイスの git ホストに届かない環境で、自動更新がオンのマーケットプレイスについて、毎セッション、新しいコミットの確認と、届かないときの clone し直しが失敗する(既存のチェックアウトは残り、起動も遅れない)。CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1 を設定すると、確認が届かないとき clone し直さず既存のチェックアウトを使う。すでに .claude-plugin/marketplace.json を持つチェックアウトにだけ効き、一度も clone していないか途中で止まったものはオンラインで追加する。完全なオフラインの展開は、CLAUDE_CODE_PLUGIN_SEED_DIR で、イメージのビルド時にプラグインのディレクトリをあらかじめ用意する
GitHub Enterprise Server のホストで追加が失敗する GHES の URL から追加してポリシーのエラーが出た(組織がマーケットプレイスの取得元を制限しており、管理者がそのホストの hostPattern を足す必要がある)か、claude.ai から追加して GitHub のアクセスエラーが出た(自分の GitHub Enterprise のアカウントがまだ接続されていない)。どちらも GHES のページ(GitHub Enterprise Server)にある

プラグインのインストール#

メッセージ 原因と対処
Plugin "<name>" not found in marketplace "<marketplace>" /plugin install <name>@<marketplace> か claude plugin install <name>@<marketplace> で、プラグイン名がそのマーケットプレイスのカタログの手元のコピーに無い。シェルの claude plugin install は、マーケットプレイスを追加していないときも同じメッセージを出す(claude plugin marketplace update <marketplace> が Marketplace '<marketplace>' not found と答えるなら先に追加する)。ヒント Your local copy may be out of date — try claude plugin marketplace update <marketplace>、または The marketplace couldn't be refreshed (...) が付くとき:オフラインのときなど、調べる前に更新しなかったので、カタログが古い。/plugin marketplace update <marketplace> で更新して、もう一度入れる。ヒントが無いとき:名前が原因の可能性が高い。/plugin の「Discover」で一覧から名前をコピーする(v2.1.232 より前は、調べて見つからなかったあと、自動更新がオンのときだけ更新した)
Plugin "<name>" not found in any marketplace @marketplace なしで /plugin install <name> を実行し、登録したどのマーケットプレイスにもそのプラグインが無い(claude plugin install <name> は Plugin "<name>" not found in any configured marketplace)。マーケットプレイス名なしでは、claude plugin install は持っているカタログを更新せずに探し、/plugin install は自動更新がオンのマーケットプレイスだけを更新する。マーケットプレイス名を付けると、探す前に更新される。どのマーケットプレイスが載せているか分からなければ、/plugin marketplace list と「Discover」で探す
Plugin '<name>@<marketplace>' is already installed globally すでにユーザースコープか管理設定で入っているプラグインに /plugin install を実行した。Use '/plugin' to manage existing plugins. と拒否される(@<marketplace> なしで打つと、メッセージに globally が無い)。すでに全プロジェクトで使える。スコープの変更・有効無効・設定は /plugin の「Installed」で行う。project か local のスコープだけに入っているものは、このメッセージにならず、ユーザースコープにも入れられる。シェルの claude plugin install は別のメッセージで、対象のスコープに入っていれば Plugin "<name>@<marketplace>" is already installed (scope: user) と出て 0 で終了する(キャッシュのディレクトリが無ければ、同じコマンドが再ダウンロードする)
"<plugin>" was not installed: it would share its folder with "<other>"(または would share its saved data with) 拒否されたプラグインの ID と、入れたプラグインの ID が、ディスク上の同じフォルダに対応する(. と @ を - と書くと同じになる。macOS と Windows では、大文字小文字だけが違う ID も同じフォルダになる)。両方を入れると片方のファイルがもう片方のフォルダに入るので拒否され、入れたほうがファイルを保つ。もう片方のプラグインが入っているなら、Only one of the two can be installed. と、外す claude plugin uninstall のコマンドか /plugin の手順を示すので、実行してからやり直す。1回のインストールで両方の ID が来るとき(プラグインとその依存)は、順序では直せず、2つを載せるマーケットプレイスの保守者が、どちらかの名前を変える必要がある(別のマーケットプレイスなら、どちらの保守者でもよい)
This plugin uses a source type your Claude Code version does not support 入れたプラグインのマーケットプレイスの項目が、この版の Claude Code が取得できない取得元の種類を使っている。Update Claude Code and try again. と続く。Claude Code を更新してからやり直す
Plugin archive integrity check failed archive の取得元に sha256 の固定があり、ダウンロードしたファイルのダイジェストが合わない。The archive was not installed. と続き、期待値と実際のダイジェストが出る。公開する側は、URL が配る実際のファイルのダイジェストを計算し直して(shasum -a 256 my-plugin.zip、PowerShell では Get-FileHash -Algorithm SHA256 my-plugin.zip)、項目の sha256 を更新する。入れる側は、セッションで /plugin marketplace update <name> でカタログを更新してからやり直す。それでも合わなければ、所有者に、固定したファイルを聞く
Marketplace "<name>" is registered from an untrusted source 追加済みのマーケットプレイスが、プラグインとともに読み込まれなくなった。/plugin の「Errors」タブか次の更新で出る。Anthropic の公式マーケットプレイス用に予約された名前で登録されているが、登録された取得元が anthropics の GitHub リポジトリでない。予約された名前は、マーケットプレイスの読み込みや更新のたびに確認される。使う側は、シェルで claude plugin marketplace remove <name> を実行して、公式の github.com/anthropics のリポジトリから追加し直す。サードパーティのマーケットプレイスの公開者は、名前を変えて、ユーザーに自分の取得元から追加し直してもらう(v2.1.205 より前は、名前を追加時にだけ確認した)
Marketplace "<name>" is added but ignored マーケットプレイスは ~/.claude/plugins/known_marketplaces.json に項目があるが、Claude Code がそのファイルを読むたびに行う検査に通らず、そのマーケットプレイスと、そこから入れたプラグインが読み込まれなくなった。シェルの claude plugin list は、影響を受けるプラグインごとに、理由と直し方を示す行を出す。セッションの /plugin の「Errors」タブでは、マーケットプレイスの名前が引用符で囲まれ、理由のあとで行が終わり、直し方は次の行に出る。is added but ignored のあとの文が、通らなかった検査を示す。Its location is on a network drive, has "." or ".." in its path, or couldn't be checked(または The folder or file it was added from の同じ文)は、マーケットプレイスのディレクトリか、追加元のローカルのパスが、ネットワーク上にあるか、パスに . か .. の区間があるか、確認できなかった。Its git URL can't be used: <reason> か Its URL can't be read as an https:// or http:// address は、記録された取得元の URL が、clone も取得も拒否される形。Its source doesn't match its extraKnownMarketplaces entry in user or managed settings は、項目が同じ名前の extraKnownMarketplaces の宣言と合わない。理由の代わりに (see the debug log) が付くときは、予約された名前の別の綴りなど、名前が拒否されており、デバッグログが項目を示す。対処は、メッセージの直し方に従う。シェルで claude plugin marketplace remove <name> を実行し、対応する取得元かローカルのパスからマーケットプレイスを追加し直して、プラグインを入れ直す(remove はそれらをアンインストールする。無視された項目にも remove は効く)。ネットワーク上に置いたままにするなら、ユーザーか管理設定の extraKnownMarketplaces に宣言する(リポジトリの .claude/settings.json や .claude/settings.local.json の宣言は数えない)。設定の宣言と取得元が違うなら、宣言した取得元から追加し直すか、宣言を変える(claude plugin marketplace add も同じ不一致を拒む)。名前が拒否されたときは、行が Remove it: のあとにコマンドを示していればそれで remove する(同じ名前での追加はまた拒否される)。v2.1.286 より前は、理由にかかわらず claude plugin list が Marketplace <name> not found、/plugin の「Errors」タブが Marketplace "<name>" is registered but was refused (see the debug log) と報告し、理由はデバッグログだけにあった。v2.1.286 では、理由と直し方の文の言い回しが違った(Its recorded location is network-shaped or unclassifiable (never probed) など)
Plugin <name> has a corrupt manifest file/has an invalid manifest file 取得したあと、プラグインの .claude-plugin/plugin.json の読み取りに失敗した(シェルでは <name> が一時ディレクトリの名前のことがあり、Failed to install plugin "<name>@<marketplace>" の接頭辞に本当の名前がある)。corrupt manifest file と JSON parse error::ファイルが有効な JSON でない。invalid manifest file と Validation errors::解析できるがスキーマに合わない(必須フィールドが無い name: Invalid input など)。claude plugin install は Failed to install plugin "<name>@<marketplace>": で報告して 1 で終了する。直すのはプラグインの作者で、それまで入れられない。自分のものなら claude plugin validate <plugin-directory> で同じエラーを、問題のあるパスつきで見て直す。他の人のものなら、メッセージをマーケットプレイスの所有者に報告する
Plugin directory not found at path: <path> 相対パス(./plugins/my-plugin)でマーケットプレイスが載せる有効なプラグインについて、「Errors」タブに出る。マーケットプレイス内にそのパスのディレクトリが無い。保守者なら項目の source のパスを直すかフォルダを戻す。そうでなければ、所有者に報告する。Marketplace directory not found at path: <path> は、マーケットプレイス自身のディレクトリが無い(ローカルのパスから追加したマーケットプレイスなら、そのディレクトリが移動したか消えた。戻すか、マーケットプレイスを外して新しい場所から追加し直す)
No plugins available/No marketplaces configured /plugin の「Discover」タブが空、または claude plugin marketplace list が No marketplaces configured と出した。マーケットプレイスが1つも登録されていない。セッションで /plugin marketplace add anthropics/claude-plugins-official を実行する
Marketplace "<name>" is already added from a different source /plugin install <plugin> --marketplace <source> で追加を確認したら、その取得元のカタログが、別の取得元からすでに追加したマーケットプレイスと同じ名前だった。Claude Code は既存のものを残し、プラグインは入らない。メッセージは To use this source instead, remove that marketplace first with /plugin marketplace remove <name> と案内する。すでに追加したほうなら /plugin install <plugin>@<name>、新しい取得元なら /plugin marketplace remove <name> のあとでやり直す
Cannot add marketplace "<name>": its source doesn't match its extraKnownMarketplaces entry in user or managed settings 追加したマーケットプレイスの marketplace.json の name が、ユーザー設定か管理設定の extraKnownMarketplaces の項目としてすでにあり、渡した取得元がその項目の取得元と違うので、追加は拒否され、何も登録されない。2つの取得元が一致するのは、種類と全フィールドの値が同じときで、渡していない ref を持つ項目は違うものに数える。GitHub のリポジトリを https://github.com/ の URL で渡したときも、Claude Code が git の取得元として記録するので、github の項目とは違うものに数える。対処は、宣言された取得元を使うこと。Claude Code は設定が宣言したマーケットプレイスを自分で登録するので、まずセッションで /plugin marketplace list を実行し、名前が出ていれば登録済みで追加は要らない。出ていなければ、項目が書くとおりの形で取得元を書いて追加する({ "source": "github", "repo": "acme-corp/claude-plugins", "ref": "v1.2.0" } の項目なら /plugin marketplace add acme-corp/claude-plugins#v1.2.0)。または宣言を編集か削除してから追加し直す(管理設定が宣言していれば管理者に聞く)。v2.1.287 より前は、メッセージが its network source differs from the one declared for it in settings で終わる形だった
Failed to install: <plugin> (<reason>) /plugin のメニューでインストールするプラグインを選び、どれも入らずにメニューが閉じて、この要約が出た。clone に失敗したあとの git の出力のような理由は、最初の1行だけが出ることがある。短くされたときは要約が Installing a plugin from its details (Enter) in /plugin shows its full error. で終わるので、「Discover」でプラグインを選んで Enter で詳細からインストールすると、詳細の画面に全文が出る。括弧内の理由が指すものを直す
Could not move the new copy of this plugin version into <path> インストールは新しいコピーをダウンロードして、その版のフォルダへ移すが、その移動が、実行中に他のプログラムがフォルダを使っていたなどで失敗した(括弧内にファイルシステムのコード)。メッセージが前のコピーの扱いを示す:The previously installed copy was moved back(入れていた版は残る)、had to be removed first・was not moved back・could not be moved back(成功するまでその版は入っていない)、そのような文なし(前のコピーが無かった)。Windows で、別のプログラムが入れたコピー自体を握っているときは、could not be replaced と It was not replaced and the new copy was discarded と出て、入れていた版は残る。Left on disk の一覧は、キャッシュ内の脇へ置いたフォルダを示し、次のその版のインストールかキャッシュの掃除で消える。~/.claude/plugins/cache のプラグインのフォルダを使っている他の Claude Code のセッション・エディタ・端末を閉じてやり直す。キャッシュのフォルダの権限を確かめるよう言われたら、書き込み権限を戻してディスクの空きを作ってやり直す
An npm plugin source must name a registry package マーケットプレイスの項目の npm の取得元のプラグインが、インストール・更新・読み込みに失敗し、メッセージにこの文が入っている。Claude Code が、取得の前に項目の package の値を検査して拒否した。メッセージは値と理由を示す("github:acme/formatter" was not installed: it is not an http or https link. ... など)。直すのはマーケットプレイスの持ち主。自分のものなら、package を npm の取得元の仕様が受け付ける値に変えるか、項目を github・url・git-subdir の取得元に替える。自分のものでなければ、持ち主にメッセージを知らせる

依存のエラー#

依存を宣言するプラグインは、依存を満たせないとき、インストールに失敗するか、入っても無効のままになります。メッセージはインストール時(インストールのエラーメッセージとして)か読み込み時(claude plugin list と「Errors」タブに出て、解決するまで影響を受けたプラグインを無効のままにする)に届きます。

メッセージ 意味 対処
Dependency "<dep>" is not installed 宣言された依存が入っていない シェルで claude plugin install <dep>@<marketplace> を実行するか、プラグインをアンインストールする。依存のマーケットプレイスがまだ登録されていなければ、追加してセッションで /reload-plugins を実行する(解決できる欠けた依存を入れる)
Dependency "<dep>" is disabled 依存は入っているが無効 依存を有効にするか、それを要るプラグインをアンインストールする
Requires "<dep>" <range>, installed <version> 入っている依存の版が、プラグインが宣言した範囲の外 依存を範囲内の版に更新するか、プラグインをアンインストールする
<Plugin or Dependency> "<name>" has conflicting version requirements すべての範囲を満たす版が無い。メッセージが範囲を並べる 衝突するプラグインのどちらかをアンインストールか更新するか、上流の作者に制約を広げてもらう
... has version requirements too complex to intersect または has an invalid version requirement 範囲が有効な semver でないか、組み合わせた範囲が交差できない 不正な範囲を直すか、長い || の連鎖を単純にする
... has no git tag satisfying <range> 依存のリポジトリに、範囲に合う <name>--v* のタグが無い 上流がその規約でリリースにタグを付けているか確かめるか、範囲を緩める
Dependency "<dep>" (required by <plugin>) is in <marketplace>, which is not in the allowlist 依存が別のマーケットプレイスにあり、マーケットプレイスをまたぐ解決は既定でオフ 依存を、プラグインを入れるスコープと同じ --scope で、シェルの claude plugin install <dep>@<marketplace> で自分で入れてから、やり直す

プログラムで見るには、シェルで claude plugin list --json を実行します。問題のあるプラグインは、メッセージの errors フィールドと、各メッセージの type を持つ errorDetails フィールドを持ちます。最初の2行は dependency-unsatisfied、3行目は dependency-version-unsatisfied です。

プラグインを入れたのに動かない#

インストールは成功したのに、プラグインのスキル・フック・サーバーが動かないときです。

症状 原因と対処
プラグインが見えない、スキルが出ない まず状態を確かめる。/plugin の「Installed」でプラグインが一覧にあり有効か(シェルの claude plugin list は版・スコープ・Status: ✔ enabled つきの同じ一覧)。同じパネルの「Errors」タブを読む(各項目はメッセージとガイダンスの行の組)。このセッション中に入れたなら /reload-plugins(Reloaded: とプラグイン・スキル・エージェント・フック・サーバーの数が出る。失敗があれば N errors during load. Run /plugin for details. が足される)。エラーなく読み込まれてもスキルが出ないなら、作っているプラグインは下の「プラグインの開発」を、他の人のものは「Installed」の詳細の画面で中身を見る(スキルが無ければ / で出すものが無い)
Run /reload-plugins to activate. インストールの要約が Plugin is now active. でなくこれで終わった。プロンプトキャッシュが無効になる、または有効化が失敗した。コマンドを打つ必要はなく、パネルが閉じて Claude Code が /reload-plugins を実行する(ストリーミング中の応答が終わるまで待たせることもある)。出力が Reloaded: なら有効になった。This reload changes MCP tools (...) — your next message will re-read the whole conversation instead of using the cache. Run /reload-plugins --force to apply. なら、プラグインの MCP サーバーか LSP ツールを足すか外すことで、プロンプトキャッシュが無効になる(LSP のときは This reload adds the LSP tool/This reload removes the LSP tool で始まる)。--force で有効にするか、新しいセッションを始める。v2.1.268 より前は、インストール中に有効にならなかったものは、自分で /reload-plugins を実行するまで保留のままだった。v2.1.246 より前は、その要約のスキルの数が commands/ の項目だけを数えたので、SKILL.md のスキルを読み込んでも 0 skills と報告された
Plugin "<name>" not cached at <path> 「Errors」タブに、ガイダンス Run /plugin to refresh the plugin cache つきで出る。Claude Code はプラグインのインストールの記録を持つが、その記録が指すディレクトリが無い(キャッシュを消したあとなど)。シェルで claude plugin install <name>@<marketplace> を実行すると、インストールのディレクトリが無いが記録があるプラグインを再ダウンロードする。そのあとセッションで /reload-plugins を実行すると、項目が消えて、プラグインが「Installed」に戻る
The packages it lists are not installed または were not installed, because ... /plugin と claude plugin list が、依存のインストールで node_modules が残らなかったプラグインにこの注記を出す。プラグインは読み込まれるが、足りないパッケージを要る部分は動かないことがある。are not installed は、このプラグインのインストールは動かせるが終わらなかった(失敗かタイムアウトなど)。注記が示す claude plugin update をシェルで実行するか、/plugin から更新して再試行する(例は claude plugin update formatter@my-marketplace)。再試行が失敗すると、出力が原因を示す。CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC を設定していると、claude plugin update と /plugin は再試行を飛ばして、プラグインが最新の版だと報告する。were not installed, because ... は、このプラグインではインストールを実行できず、注記が理由(Yarn・pnpm・bun.lockb のロックファイル、またはそのパッケージマネージャーがこのコンピュータに無いロックファイル)を示す。その理由が続くあいだは、更新してもパッケージは入らない。理由がロックファイルなら作者が置き換える。パッケージマネージャーが無いなら、入れてから更新する
installed_plugins.json holds a record under "<id>" that this version of Claude Code cannot read claude plugin list は Note: として出し、claude plugin install・uninstall・update は Plugin "<name>" was not installed:・was not uninstalled:・was not updated: に続けて同じ文で拒否する(--json では結果の行が同じ message と failureCode: "install_records_unreadable" を持つ)。複数の記録があると holds records under、ファイル全体がこの版の知らない形式を宣言していると installed_plugins.json is in a format (version <N>) that this version of Claude Code does not know。名指しされた記録は有効な JSON と有効なプラグイン ID だが、フィールドがこの版では解析できない(別の、たぶん新しい版の Claude Code が書いたもの)。その記録があるあいだ、この版はファイルを書き直さない。順に:claude update で更新する、更新できないなら記録を書いた版の Claude Code でそのプラグインをアンインストールする、それでも駄目なら installed_plugins.json からその記録を手で消して Claude Code を再起動するか /reload-plugins を実行する
installed_plugins.json could not be read and was rebuilt claude plugin list が、installed_plugins.unreadable.<date>.<hash>.kept というファイルのパスつきで、そのファイルが installed_plugins.json の隣にあるあいだ出す。installed_plugins.json が有効な JSON でないか、プラグインの一覧でなく、何を入れたかを伝えられない。.kept ファイルを開いて、古いファイルが記録していたものを見て、足りないプラグインを入れ直す。Claude Code はそのファイルを読み戻さず、cleanupPeriodDays の予定で消える
install records under names that no version of Claude Code can use were removed from installed_plugins.json claude plugin list が、installed_plugins.set-aside.<date>.<hash>.json というコピーのパスつきで、そのコピーが installed_plugins.json の隣にあるあいだ出す。Nothing needs doing about these copies. で終わる。installed_plugins.json の記録が、有効なプラグイン ID でないキーの下にあって、どの版の Claude Code も使えなかった。ファイルの残りは普通に読み込まれる。Claude Code は使えない記録を .set-aside ファイルにコピーして一覧から落とし、コピーは読み戻さず、cleanupPeriodDays の予定で消える
Disabled in ~/.claude/settings.json but still loads ~/.claude/settings.json で false にしたプラグインの行が、これと、有効にする出どころ(— project settings enable it, which overrides your user setting など)を示す。優先度が高い出どころの true が上書きしている。自分のマシンで外れるには、プロジェクトのファイルより優先度が高い .claude/settings.local.json でその ID を false にする。claude plugin list が required by your org と付けるなら、設定ファイルは関係なく、組織が claude.ai でその同期されたプラグインを必須にしている
Plugin "<name>" is enabled in project settings but isn't installed here プロジェクトの .claude/settings.json が有効にするプラグインについて「Errors」タブに出る。ガイダンスは Run claude plugin install <name>@<marketplace> --scope project to install it for this project。リポジトリの設定は、開いた全員のためにプラグインを有効にするが、入れはしない。GitHub のリポジトリや npm パッケージのような外部の取得元なら、自分で入れるまで Claude Code はダウンロードしない。シェルでガイダンスのコマンドを実行してからリロードする。/reload-plugins のあと、項目が消えて、プラグインが「Installed」に出る。組織がプラグインを先に入れるのは、管理設定による

フックとサーバー#

症状 原因と対処
Failed to load hooks from <path>: <reason> hooks/hooks.json が有効な JSON でないか、フックのスキーマに合わない。理由が解析か検証のエラーを名指しする。ファイルを直す。公開前に hooks/hooks.json の JSON の構文の問題を見つけるには、シェルで claude plugin validate <plugin-directory> を実行する
hooks path not found: <path> マニフェストの hooks が、プラグインのルートからの相対でそのパスに無いファイルを指している。パスを直すかファイルを足す
... hook error: Failed with non-blocking status code: <stderr> フックは動いたが、コマンドが失敗した。たとえば Stop hook error: Failed with non-blocking status code: /bin/sh: node: command not found は、Claude Code が起動したシェルが node を見つけられなかった。入れるか、claude を起動した端末の PATH に通す。stderr にプラグインのパスが空白で切れて出るときは、フックのシェル形式のコマンドが ${CLAUDE_PLUGIN_ROOT} を引用符の外で使い、インストール先のパスに空白がある。変数を二重引用符で囲むか、exec 形式にする。引用符の外の変数は、プラグインのディレクトリに claude plugin validate を実行して、引用の警告で見つける。ほかのエラーは、プラグインのディレクトリからフックのコマンドを自分で動かして全出力を見るか、デバッグログで stderr 全体を取る
フックがツール呼び出しやプロンプトをブロックする 終了コード 2 で終わるフックは、動かした対象をブロックする。プラグインのフックがこの方法でブロックし、stderr がブロックのメッセージなら、エラーは This hook comes from the <plugin> plugin. で終わるので、どのプラグインを無効にするか直すかが分かる(v2.1.281 より前は、エラーがプラグインを名指ししなかった)
フックが読み込まれるのに発火しない 定義を確かめ、動かして見る。イベント名は大文字小文字を区別するので、PostToolUse のように正確に合わせる。フックの matcher がツール名に合うか確かめる。PostToolUse のフックなら、Claude にファイルの編集を頼んで意図的にイベントを起こす。デバッグログを開く。どのフックが一致したかが記録され、動いたフックは終了コードつきで出る
Invalid MCP server config for "<server>": <error> サーバーの設定はスキーマの確認を通るが、Claude Code がこのセッション用に解決できない。コロンのあとのテキストが原因と対処を示す。Missing environment variables: <names>:Claude Code を起動するシェルでその変数を設定して新しいセッションを始める。URL is unset or invalid:URL が使う ${user_config.*} のオプションが未設定で、/plugin configure <plugin> で設定する。has an invalid MCP url、または headersHelper for MCP server '<server>' references ${user_config.*}:プラグイン自身の設定の誤りなので、プラグインの MCP 設定の url か headersHelper を直す(自分のものでなければ作者に報告する)
Bundled MCP server "<name>" was not started: it needs configuration プラグインが user_config を宣言する MCPB バンドルとしてサーバーを含み、必須の設定に保存値が無いか、保存値がバンドル自身の検証に失敗するので、Claude Code がサーバーを起動しない。プラグインの他の部分は動く。/plugin の「Installed」タブでプラグインを選び「Configure」で値を与える。保存後、/plugin が Configuration saved. と出して閉じ、Claude Code がプラグインを再読み込みして、その適用後にサーバーが起動する(v2.1.285 より前は、この行なしでサーバーを飛ばした)
サーバーが設定されているが接続しない /mcp でサーバーの状態を見る(正常なら接続済みと出る)。サーバーが起動中に出したエラーを読むには、claude --debug を実行して ~/.claude/debug/<session-id>.txt のログを開く(--debug は端末には出力しない)。スキーマに合わない .mcp.json のサーバーの項目は「Errors」タブに出ず、Claude Code がそのサーバーを落として、そのデバッグログにだけ Invalid MCP server config for <server> in <path> を記録する。プラグインを読み込まずに見つけるには、プラグインのディレクトリでシェルの claude plugin validate を実行する(エラーとして報告される。v2.1.281 より前は、.mcp.json を確認しなかった)
--plugin-dir では動くのにインストール後に失敗する(作者向け) Claude Code はインストールしたプラグインをキャッシュへコピーするので、ソースのディレクトリでだけ通るパスは壊れる。プラグイン内のパスは ${CLAUDE_PLUGIN_ROOT} で書く。プラグインのディレクトリの外へ届くパスは、下の「プラグインの開発」を見る
言語サーバーが起動しない プラグインは、別に入れた言語サーバーのバイナリに接続し、Claude Code は PATH からコマンド名で起動する。/plugin の「Errors」タブに Executable not found in $PATH: "<binary>" のような理由つきで失敗が出て、claude --debug には LSP server <name> failed to start: <reason> と記録される。バイナリを入れ、claude を起動する端末の PATH にあることを確かめて(which typescript-language-server など)、新しいセッションを始める
言語サーバーがメモリを使いすぎる rust-analyzer や pyright のような言語サーバーはプロジェクト全体をインデックスする。セッションで /plugin disable <plugin> で無効にし、Claude の組み込みの検索ツールに任せる
モノレポで誤った診断が出る ワークスペース用に設定されていない言語サーバーは、内部のパッケージの解決できない import を報告することがある。Claude Code の側で直すものは無く、診断は Claude のコード編集を止めない

プラグインの開発#

メッセージと症状 原因と対処
commands path not found: <path> 「Errors」タブに、絶対パスと、ガイダンス Check that the path in your manifest or marketplace config is correct つきで出る。skills・agents・hooks でも同じメッセージが出る。plugin.json かマーケットプレイスの項目のパスを、プラグインのルートに対して解決したが、そこに何も無かった。メッセージのパスが確認した絶対パスなので、ディスクと比べる。パスを直すかディレクトリを作って /reload-plugins を実行する。マニフェストのパスはプラグインのルートからの相対で ./ で始まる。ルートの外へ解決されるパスは、代わりに <component> path escapes plugin directory と報告されて落とされる
--plugin-dir をマーケットプレイスのルートに向けても plugins/ 以下のプラグインが読み込まれない --plugin-dir は、プラグインのルート(.claude-plugin/plugin.json と skills/ などのコンポーネントのディレクトリがある場所)を取る。マーケットプレイスのルートに向けると、marketplace.json は読まれないので、plugins/ の下のプラグインは読み込まれず、エラーも出ない(v2.1.281 より前は、マーケットプレイスのルートを、そのディレクトリの名前の空のプラグインとして読み込んでいた)。claude --plugin-dir ./my-marketplace/plugins/my-plugin のように、プラグインのディレクトリ自体に向ける。「Installed」の詳細の画面で、コンポーネントが一覧に出る
プラグインが自分のディレクトリの外に参照するファイルが見つからない --plugin-dir では動くのに、インストール後に ../shared-utils のようなパスについてのエラーで失敗する。Claude Code はインストールしたプラグインをキャッシュへコピーして読み込むので、プラグイン自身のディレクトリの外へ届くパスは、キャッシュでは何も指さない。共有ファイルをプラグインのディレクトリの中へ移すか、その中のシンボリックリンクで参照する
Windows で ${CLAUDE_PLUGIN_ROOT} がスラッシュで出る Windows で、プラグインのフックが ${CLAUDE_PLUGIN_ROOT} を C:\Users\you\... でなく C:/Users/you/... で受け取り、バックスラッシュを前提にしたスクリプトが壊れる。Claude Code は Windows でシェル形式のフックを Git Bash で動かし、意図的に、スラッシュの Win32 形式でプラグインのルートを置換する(Bash の組み込み・MSYS のツール・ネイティブの Windows バイナリはすべてその形式を受け付ける)。スクリプトがバックスラッシュを要るなら、ネイティブのパスを保つ形に切り替える:args の配列でプロセスを直接起動する exec 形式のフック、または "shell": "powershell" のフック
プラグインは読み込まれるがスキルが出ない 「Installed」にエラーなく出るのに、/ でスキルが出ない。スキルはプラグインのルートの skills/、コマンドはルートの commands/ から読み込まれる。.claude-plugin/ に置くのは plugin.json だけで、その中の skills/ は走査されない。ディレクトリをルートへ移して /reload-plugins を実行する。各スキルは SKILL.md を含むディレクトリで、SKILL.md ファイルを指すマニフェストの skills の項目は path is a file; skills entries must be directories containing SKILL.md と報告される
スキルは読み込まれるが Claude が呼ばない 自分で /<plugin>:<skill> を打つと動くが、普通の依頼では Claude が呼ばない。順に確かめる:disable-model-invocation: true を設定していないか(ひな型のスキルは設定している。Claude に呼ばせたいスキルでは、その行を外す)、説明が人の頼み方に合っているか、説明が切り詰められていないか(多数のスキルが入っていると、Claude Code は一覧の文字数の予算に合わせて説明を縮め、依頼に合うのに要るキーワードを落とすことがある。スキル)。現実的なプロンプトでどのくらい発火するかを測るには、tool_used: Skill のグレーダーの eval ケースを書き、説明を変えるたびに claude plugin eval を実行する
<directory> is not a plugin or skill folder(claude plugin eval init) ホームディレクトリや、プラグインをサブディレクトリに持つリポジトリのルートのような、プラグインのルートでないディレクトリから実行した。init は作業ディレクトリの下にスイートを書くので、プラグインが見ない evals/ ディレクトリを作らず止まる。プラグインのルート(.claude-plugin/plugin.json かスキルの SKILL.md があるディレクトリ)へ移ってやり直す。別の場所にわざと作るなら --eval-dir を渡す
userConfig のダイアログが出ない インストールが値を尋ねるかは、実行する場所による。セッションの /plugin install か /plugin の「Discover」タブ:ダイアログはこの対話のインストールの一部。VS Code 拡張の「Manage plugins」:インストール後に、未設定のオプションをフォームで尋ねる(v2.1.285 より前は、そこでのインストールにオプションのフォームが出なかったので、端末のセッションで /plugin configure <plugin>@<marketplace>)。シェルの claude plugin install:userConfig の値は尋ねない。渡した --config KEY=VALUE を保存し、未設定のオプションが残ると N userConfig options not yet set — run /plugin configure <plugin>@<marketplace> in Claude Code, or pass --config KEY=VALUE. と出す(未設定の必須があると、not yet set に (M required) が続く)。シェルで入れたなら、claude plugin install my-plugin@my-marketplace --config api_url=https://example.com のようにオプションごとに --config で渡す。すべて設定されると not yet set の行は出ない。あとから開くには、セッションで /plugin configure my-plugin@my-marketplace。シェルからは claude plugin configure(v2.1.285 以降)。マニフェストが宣言しない --config のキーを渡すと、プラグインは入るが ⚠ Installed, but --config not applied: --config key "<key>" isn't declared in this plugin's userConfig. と、プラグインが宣言するキーが出る。自身の user_config を宣言する MCPB バンドルのファイルを同梱するプラグインでは、メッセージが isn't declared in this plugin's userConfig or by its bundled MCP servers. になり、既知のキーに <server>.<key> の形のサーバーのキーも含まれる(URL で参照するバンドルはインストール時に読まれないので、キーは並ばず、メッセージが /plugin で設定するよう言う)
claude plugin validate がエラーを出す Found N errors と Validation failed を出して 1 で終了した。下の表を見る
Plugin <name> has conflicting manifests Plugin <name> has conflicting manifests: both plugin.json and marketplace entry specify components. で読み込みに失敗する。プラグインが自分の plugin.json を持ち、マーケットプレイスの項目が strict: false で、commands・agents・skills・hooks・outputStyles・themes のどれかも宣言している。項目からそれらのフィールドを外すか、項目で strict: true にして、Claude Code に plugin.json へ足させる
Warning: No commands found in plugin <name> custom directory プラグインの読み込み時に、claude --debug のログ ~/.claude/debug/<session-id>.txt に Warning: No commands found in plugin <name> custom directory: <path>. Expected .md files or SKILL.md in subdirectories. が記録される。セッションにも「Errors」タブにも出ない。マニフェストの commands のパスは存在するが、.md ファイルも、サブディレクトリの SKILL.md も無い。コマンドのファイルを足すか、マニフェストからパスを外す

claude plugin validate(セッションでは /plugin validate <path>)のメッセージは次のとおりです。検証を止めるメッセージと、--strict を渡したときだけ止める2つの警告(No frontmatter block found と Unknown field '<key>')を載せています。説明の欠けのような他の警告は載せていません。検証器は、プラグインのディレクトリなら .claude-plugin/plugin.json、マーケットプレイスのディレクトリなら .claude-plugin/marketplace.json のマニフェストを読み、マーケットプレイスでは、項目自身のマニフェストの問題の前に項目のインデックスを付けます(plugins[1] plugin.json → json: ...)。

メッセージ 原因 対処
File not found: <path> パスにマニフェストが無いか、存在しない .claude-plugin/ を含むプラグインかマーケットプレイスのルートに対して実行する
No manifest found in directory. Expected .claude-plugin/marketplace.json or .claude-plugin/plugin.json ディレクトリに .claude-plugin/ のマニフェストが無い マニフェストを作るか、正しいディレクトリを指す
Invalid JSON syntax: <parse error> マニフェストか hooks/hooks.json が有効な JSON でない JSON を直す。hooks/hooks.json を直すまで、セッションはそのファイルのフックなしでプラグインを読み込む
Path not found: <path>. The runtime loader will report this as a load failure. マニフェストのコンポーネントのパスが存在しない パスを直すか、ディレクトリを作る
Path contains ".." which could be a path traversal attempt: <path> コンポーネントのパスがプラグインのディレクトリの外へ出る プラグインのルートの内側のパスを使う
Path is a file; skills entries must be directories containing SKILL.md skills の項目が、ディレクトリでなく SKILL.md を指している 親のディレクトリ、またはルートの SKILL.md なら . を指す
No frontmatter block found または YAML frontmatter failed to parse: <error> スキル・エージェント・コマンドのファイルの YAML のフロントマターが無いか不正 --- の区切りの間のフロントマターを足すか直す。プラグインのディレクトリを検証するときに報告される
Plugin name "<name>" is reserved: it passes as one of Anthropic's own プラグインの name が予約された名前の1つ プラグインの働きに合う名前に変える
Unknown field '<key>' マニフェストにスキーマが定義しないフィールドがある 取り除くか、メッセージが示す名前を使う。Claude Code は読み込み時に未知のフィールドを無視する。plugin.json の privacyPolicyUrl などのディレクトリ掲載用のフィールドは、マニフェストの「ディレクトリ掲載用のフィールド」を参照

マーケットプレイスのファイル自体の検証メッセージは次のとおりです。claude plugin validate は、source がローカルのパスの各項目も検証し、項目の version がプラグイン自身のマニフェストと食い違うと警告します。項目の階層のメッセージは、上のプラグインのメッセージに plugins[N] plugin.json → が付いたものです。

メッセージ 種類 対処
Duplicate plugin name "<name>" found in marketplace エラー 各プラグインに一意の name を付ける
plugins[N].source の下の Path contains "..": <path> エラー .. を含まない、マーケットプレイスのルートからのパスを使う
Marketplace name cannot contain control or bidirectional-formatting characters エラー 名前からエスケープや改行などの文字を取り除く
Plugin name cannot contain control or bidirectional-formatting characters エラー プラグインの name からその文字を取り除く
Claude Code cannot install plugins from marketplace "<name>". ...Change the marketplace's "name". エラー プラグイン ID の各部分は a-z・A-Z・数字・.・_・- だけで、英字か数字で始まる。メッセージが示す規則に合うよう、マーケットプレイスの名前を変える
Claude Code cannot install plugin "<name>". ...Change this entry's "name". エラー 同じ規則に合うよう、項目の名前を変える
Marketplace has no plugins defined 警告 plugins に少なくとも1つ項目を足す
No marketplace description provided 警告 トップレベルの description を足す
plugins[N] plugin.json → name の下の Plugin name "<name>" is not kebab-case 警告 小文字・数字・ハイフンにする。claude.ai のマーケットプレイスの同期がその形を要求する
Entry declares version "<a>" but <path>/plugin.json says "<b>" 警告 項目を plugin.json に合わせる(インストール時に plugin.json が権威)
Marketplace name "<name>" is reserved in Claude Desktop 警告 マーケットプレイスの名前を変える。Claude Desktop のマネージドマーケットプレイスの同期が、どの大文字小文字でも org・org-provisioned・unknown を拒否する
Marketplace name "<name>" is not accepted by Claude Desktop または Plugin name "<name>" is not accepted by Claude Desktop 警告 英数字・.・_・- の128文字以内に直し、英字か数字で始める

v2.1.247 より前は、制御文字や双方向の書式文字を含むマーケットプレイスの名前は、Marketplace name impersonates an official Anthropic/Claude marketplace としてだけ報告されました。

マーケットプレイスの運営#

症状 原因と対処
URL ベースのマーケットプレイスで相対パスのプラグインが失敗する ユーザーが https://example.com/marketplace.json の URL で追加した。source が ./plugins/my-plugin のような相対パスのプラグインのインストールは its marketplace entry path does not stay inside the marketplace directory で失敗し、入れ済みのものは Plugin source path refused で読み込めない。URL ベースのマーケットプレイスを追加すると、marketplace.json のファイルだけがダウンロードされ、相対パスで指すプラグインのファイルは取得されない。各項目に単独で取得できる取得元を与える({ "name": "my-plugin", "source": { "source": "github", "repo": "owner/repo" } })か、マーケットプレイスを git リポジトリにホストしてリポジトリの URL で追加してもらう(git の取得元は、リポジトリ全体を clone するので相対パスが解決される)
マーケットプレイスの検証メッセージ claude plugin validate . をマーケットプレイスのディレクトリで実行してのエラーと警告は、上の検証メッセージの表を見る

組織のポリシーによる拒否#

組織が管理設定でプラグインを制限していて、コマンドがポリシーのメッセージで拒否されたときの索引です。メッセージごとに、背後の設定が分かるので、管理者に何を頼むかが分かります(管理者側はプラグインを作って配る)。

メッセージ 背後の設定と対処
Marketplace source '<source>' is blocked by enterprise policy /plugin marketplace add・update・インストールがこの行で拒否された。GitHub か git の取得元では、'github:owner/repo' (github.com) のように括弧にホストが続く。管理者が管理設定で blockedMarketplaces か strictKnownMarketplaces を設定し、この取得元が許可されていない。管理者に取得元を許可してもらうか、メッセージが並べる許可された取得元を追加する。残りで種類が分かる:Allowed sources: <list> は strictKnownMarketplaces の許可リストによるブロック。No external marketplaces are allowed. は許可リストが空。「略記が github.com を前提にする」という Tip: は、許可リストがホスト名で git ホストを許可していて、渡した owner/repo の略記が github.com を指している(リポジトリが内部ホストにあるなら、git@your-git-host.com:owner/repo.git のような完全な URL で追加し直す)。ポリシーがより制限的になる前に追加したマーケットプレイスも、ポリシーが更新のたびに適用されるので更新されなくなる
Marketplace "<name>" is not in the allowed marketplace list(または is blocked by enterprise policy) 登録済みのマーケットプレイスについて「Errors」タブに出る。マーケットプレイスの取得元をブロックするのと同じ管理設定が、読み込み時にも適用される。strictKnownMarketplaces にこのマーケットプレイスが無いか、blockedMarketplaces が名指ししているので、Claude Code はそのマーケットプレイスとプラグインの読み込みを止める。許可リストの場合、ガイダンスの行は許可された取得元か Contact your administrator to configure allowed marketplace sources を示し、ブロックリストの場合は This marketplace source is explicitly blocked by your administrator と出る
Plugin "<name>" is blocked by your organization's policy and cannot be installed インストールがこの行で拒否された(有効にする操作は同じ行が cannot be enabled で終わる)。インストールか更新が、理由を示す文で拒否されることもある:Plugin "<name>" is from marketplace "<marketplace>", which is blocked by your organization's policy、または Plugin "<name>" depends on "<dep>", which is blocked by your organization's policy。管理設定が、このプラグイン・そのマーケットプレイス・要る依存をブロックしている。どの項目が当てはまるか管理者に聞く。依存がブロックされているなら、依存のマーケットプレイスが許可されるまで入れられない
--plugin-dir is disabled by your organization's managed settings (disableSideloadFlags) --plugin-dir・--plugin-url・--agents・--mcp-config で claude を起動した。Claude Code は、このメッセージと Plugins, custom agents, and MCP servers can only be loaded from sources your administrator has approved. で終了した。管理者が管理設定の disableSideloadFlags を設定し、任意のパスからプラグイン・エージェント・サーバーを読み込むフラグが止められている。承認されたマーケットプレイスから読み込むか、管理者に設定を外してもらう。関連して、「Errors」タブの --plugin-dir copy of "<name>" ignored: plugin is locked by managed settings は、管理設定がそのプラグインを名前で有効か無効にしているので、フラグがポリシーを覆さないよう、--plugin-dir のコピーを無視する
Plugins from ~/.claude/skills/ are blocked by your organization's managed settings claude plugin init か claude plugin enable がこの行で止まった。メッセージが strictKnownMarketplaces or blockedMarketplaces を名指しし、strictKnownMarketplaces に {"source":"skills-dir"} を足すか、blockedMarketplaces から外すよう管理者に頼む。skills-dir の取得元は、~/.claude/skills/ から読み込むプラグインを表す
Command-sourced plugins are disabled by your organization's managed settings command の取得元のプラグインのインストールか更新が、この行と The plugin was not installed or updated and its command was not run. で止まった。管理者が disableCommandPluginSources を設定したので、Claude Code はプラグインを作るためにマーケットプレイスが宣言するコマンドの実行を拒否する。disableCommandPluginSources が未設定で allowManagedHooksOnly だけを設定しても、同じ効果になる。ポリシーが許す取得元の種類でそのプラグインを公開できるか管理者に聞く
Marketplace '<name>' is seed-managed claude plugin marketplace update <name> が Marketplace '<name>' is seed-managed (<dir>) と管理者に聞くヒントで失敗した。運用者が CLAUDE_CODE_PLUGIN_SEED_DIR でこのマーケットプレイスをあらかじめ用意しており、Claude Code は種で管理されたマーケットプレイスを読み取り専用として扱う。まとめての marketplace update は、それを飛ばして他を更新する。内容を変えるには、種のイメージを保守する人に更新してもらう

公式ドキュメント(英語)

2026年10月5日時点の内容をもとに、日本語でまとめています。

ページの一覧