Claude Codeのmarketplace skills配列がweb版で無視される報告
marketplace.jsonのskills配列はCLIでは効くのに、claude.ai webとデスクトップでは全プラグインにリポジトリ全体のskillsが配られるという報告。作者側の確認手順を紹介します。
マーケットプレイスのskills配列でプラグインごとにスキルを絞っても、claude.ai webとデスクトップアプリではその絞り込みが効かず、全プラグインがリポジトリのスキル全体を配るという報告が、GitHubのissue #96319に上がっています。CLIでは意図どおりに絞られるため、ターミナルだけで動作確認した作者は気づけません。
このissueは起票時点でopenで、メンテナーからの返信はありません。本記事は報告内容と公式仕様を突き合わせ、自分のマーケットプレイスが影響を受けるかを確かめる手順をまとめます。
何が報告されているのか
報告者の構成は、プライベートのGitHubリポジトリに18個のプラグインを置いたマーケットプレイスです。全プラグインが"source": "./"でリポジトリのルートを指し、"strict": falseで、plugin.jsonは置かず、各エントリーのskills配列に1〜5個のサブディレクトリを書いています。リポジトリには36個のSKILL.mdフォルダーがあります。
この構成でCLIは配列どおりに絞り、claude.ai webとデスクトップアプリ(macOS)は絞りません。起票時のバージョンはCLI 2.1.280、デスクトップアプリ2.7032.0です。
同じマーケットプレイスの見え方
ターミナルのCLI
プラグインAに1つ宣言すれば、見えるスキルは1つです。
claude.ai webとデスクトップ
プラグインAだけをインストールしても、リポジトリ内の全スキルが読み込まれます。
公式仕様ではどう動くはずか
マーケットプレイスのエントリーがplugin.jsonを持たない場合、エントリー自体がマニフェストになります。strictの値は関係しません。ルートをsourceに取るエントリーが特定のskillsサブディレクトリを列挙すると、列挙したものだけが読み込まれ、既定のskills/は走査されません。プラグインのリファレンスにこの挙動が書かれています。
報告者の期待もこの仕様と同じで、プラグインAはskills配列のスキルだけをplugin-a:<skill>の名前空間で出し、バンドルしたmcpServersもそのスキルにだけ効く、というものです。仕様の記述はCLIの挙動を前提にしており、webとデスクトップのローダーが同じ規則に従うことまでは書かれていません。
報告されている4つの症状
issueが挙げる症状は4つです。
- 全スキルが各プラグインの下に載る: 1つ宣言したプラグインを入れても、リポジトリの全スキルがそのプラグインの名前空間に載ります。6プラグインを入れると、各スキルの同一コピー(md5で確認)が6個できました。
- プラグイン画面が食い違う: インストール前の詳細ページは全スキルを並べ、インストール後は宣言した分だけを並べます。実際には全部が載っているので、利用者は漏れに気づけません。
- インストールごとに全体のスナップショットになる: プラグインAを入れた後にマージされたスキルは、Aには無く、その後に入れた他のプラグインには載ります。自分のプラグインにだけ無いスキルが無関係な3つの下にある、という見え方になります。
- スキルとMCPサーバーの組み合わせが崩れる: AtlassianとFigmaのように、プラグインごとに別のMCPサーバーを束ねていても、漏れたスキルはそのサーバーを宣言していないプラグインに載ります。
claude plugin validateはこの構成で通ります。エラーも出ません。
自分のマーケットプレイスで確かめる手順
影響を受けるのは、複数のプラグインが同じsourceを共有し、skills配列で出し分けている構成です。プラグインごとにディレクトリが分かれていて、skills/の中身がそのプラグイン専用なら、配列の絞り込みに頼っていないため症状は出にくい構成です。
まずmarketplace.jsonが次の形かを見ます。
{
"name": "team-marketplace",
"plugins": [
{ "name": "plugin-a", "source": "./", "strict": false,
"skills": ["./skills/review"] },
{ "name": "plugin-b", "source": "./", "strict": false,
"skills": ["./skills/deploy", "./skills/lint", "./skills/audit"] }
]
}形が当てはまるなら、次の順で差を見ます。
CLIとwebの差を見る手順
- 1
CLIで基準を作る
マーケットプレイスを追加し、プラグインAだけをインストールします。
/pluginの詳細でスキルが宣言した数だけであることを控えます。 - 2
claude.ai webで同じ操作をする
同じマーケットプレイスを追加し、プラグインAだけをインストールします。
- 3
チャットでスキルを数える
新しいチャットでスキルの一覧を尋ねるか、
/mnt/skillsの中身を見ます。webはサーバー側でスキルを/mnt/skillsにまとめて配る方式なので、ここにプラグインAの宣言外のスキルが並べば、報告と同じ現象です。名前空間はプラグイン名になります。 - 4
デスクトップアプリでも繰り返す
デスクトップは埋め込みのAgent SDKが読むローダーで、名前空間にSHAが付きます。webと結果が揃うとは限らないので、両方で確かめます。宣言外のスキルが載り、かつCLIでは載らないなら、報告と同じ現象と判定できます。
CLI側の宣言が正しく効いているかは、次のコマンドでも見られます。
claude plugin validate .
claude plugin details plugin-avalidateは通るので、これは「宣言が文法的に正しい」ことの確認にとどまります。webとデスクトップの挙動までは保証しません。
影響が出やすい場面
スキルの出し分けに意味がある構成ほど、漏れの害は大きくなります。
- スキルとMCPを組にしているチーム: 漏れたスキルが、必要なサーバーを持たないプラグインの下で動こうとします。
- 社内配布で役割別にプラグインを分けている場合: 経理向けのスキルが開発者向けのプラグインにも載ります。権限の分離を
skills配列に頼っていると、見える範囲がずれます。 - スキル数が多いリポジトリ: 同一コピーがプラグインの数だけ増えるため、一覧が膨らみます。
配布を許可制にしたい場合は、スキルの出し分けではなくソースの制限が別の仕組みです。管理側の設定はstrictPluginOnlyCustomizationの記事にあります。
作者側でできること
報告者は、マーケットプレイス作者の側で取れる回避策は無いと書いています。根拠として挙げているのは#15439と#53948の2件です。どちらも、作者が逃げ道にしそうな手段の行き止まりを示しています。
- ソースの分割(#15439): プラグインのソースにサブディレクトリ(
path)とrefを指定したいという機能要望です。リポジトリ全体が丸ごと取り込まれるため、プラグイン専用の置き場に分けにくい、という不満が書かれています。起票は2025-12-26で、2026-08-17にcompletedで閉じています。web版とデスクトップで分割が効くかは、このissueからは分かりません。 - シンボリックリンクで絞る(#53948): #13344の回避策として、共有の
skills/から必要なスキルだけをリンクで集める運用がありました。v2.1.117以降、plugin installがリンク先のスキルをキャッシュにコピーしなくなったという報告で、2026-04-27に起票され、2026-05-29にnot plannedで閉じています。 plugin.jsonを足す: 報告者はplugin.jsonを置いていません。置けば絞れるという検証は、issueにありません。
そのうえで、設計面で影響を小さくする方向は考えられます。
- プラグインごとにディレクトリを分け、各
sourceをそのディレクトリに向ける。1つのリポジトリに全スキルを置く構成より、漏れる範囲が小さくなります。ただしこの分割がweb版で効くという検証報告はissueにありません。 - 権限の分離や機密性が絡むスキルは、
skills配列の絞り込みだけに頼らず、別のマーケットプレイスや別のリポジトリに置く。 - webとデスクトップに配るかどうかを決める。マーケットプレイスを追加するときの宣言先の選択はclaude plugin marketplace addの記事で扱っています。
claude.ai webとデスクトップアプリでこのマーケットプレイスを追加していなければ、報告された症状は出ません。issueの再現条件は、この2つの面でマーケットプレイスを追加してプラグインをインストールすることだからです。
過去の報告との関係
このissueは新規の問題ではなく、過去の報告の再起票です。
| issue | 対象 | 状態 |
|---|---|---|
| #13344 | 対象CLIでプラグインの有効・無効が無視され全スキルが読み込まれる | 状態2026-08-19にcompletedで閉じた |
| #76448 | 対象デスクトップアプリのローダーがskills配列を無視 | 状態2026-09-07にnot plannedで閉じた(staleによる自動クローズ) |
| #96319 | 対象claude.ai webとデスクトップの両方 | 状態open(2026-09-23起票) |
#13344のCLI側はバージョン2.1.206前後で直ったとissueは書いています。ただし、バージョン2.1.206の更新履歴にこの修正の項目は見当たりません。
#76448は2026-09-07にstaleで自動クローズされ、メンテナーの返信は付きませんでした。そのため、報告者は同じ内容をwebも含めて出し直しました。デスクトップはSHA付きの名前空間、webはプラグイン名の名前空間という違いがあり、報告者は単一のローダーの不具合ではなく、2つの非CLIローダーが同じフィールドを無視していると見ています。
別のユーザーが9月23日に付けたコメントによれば、このissueも自動クローズに向かっています。staleを避けるには、14日の間隔が切れる前に10件以上の親指か、コメントが必要とのことです。
この自動クローズの方針自体が、issue #87647(2026-08-18起票、open)で問題にされています。起票者によると、スイープのワークフローは14日でstale扱いにし、さらに14日でクローズします。10件以上の親指が付いたissueだけがstale判定から外れます。has reproラベルの付いた6,000件超が、2026年3月以降にこの形で閉じられたと書かれています。再現手順を持つissueは放置で閉じないというメンテナーの説明とずれる、という指摘です。
つまり、#96319が残るかは再現した人の書き込み次第です。再現できた人が環境と手順を書き足すことが、事実上の優先度付けになっています。
関連する記事
Claude Code をもっと見る →Claude Codeとは — できること・料金・始め方と使い方の全体像
CLAUDE_CODE_PLUGIN_PREFER_HTTPSでCIのプラグインclone失敗を直す
Marketplace is already added from a different sourceの原因と対処
claude plugin installの導入経路を選ぶ — --marketplaceと@形式の使い分け
claude plugin marketplace addの3フラグ — 部分取得・宣言先・claude.ai連携
strictPluginOnlyCustomizationでskillsやhooksをプラグインに絞る