Claude Code Pluginを作成してチームで共有する

Claude Code Pluginを作成してチームで共有する

2025.11.27

Introduction

Claude Codeが正式リリースされて半年以上たちました。
日常的に使用するのは当たり前となっていますが、
その分いろいろな課題もでてきます。

コンテキスト問題

  • 専門知識(コーディング規約、レビュー観点、ドメイン知識)を毎回プロンプトで説明するのが面倒(トークンを大量消費)
  • 複数の専門タスクを同時実行したいが、コンテキストウィンドウに収まりきらず頻繁にcompactが走る

タスク処理の非効率性

  • 詳細な作業によってメインの会話が脱線して本来の目標を見失う
  • 複数の専門タスクを順次処理するため時間がかかる
  • タスクに対して不必要な権限まで与えてしまう

設定の共有・標準化がやりにくい

  • チームメンバーごとに異なる設定で非効率
  • 複数リポジトリで同じような設定をコピペしている
  • ベストプラクティスの配布・メンテナンスが手間

これらの課題に対し、Claude Codeが持っている3つの機能が解決の助けになります。

課題 解決策 機能
コンテキスト問題 段階的開示で必要な知識だけを自動ロード Skills
タスク処理の非効率性 独立コンテキストで専門タスクを並列実行 Subagent
設定の共有・標準化がやりにくい 全コンポーネントをパッケージ化して配布 Plugin

本記事では、シンプルなSkill&Subagentを作成し、
それをPluginとしてパッケージ化し、チームで共有する方法を解説します。

なお、本稿で作成したClaude Code用プラグインはここにあります。

Claude Code Skills

概要

まずはSkillについて簡単に説明します。
Claude Code Skillsはタスクの指示や実行可能コードを含む再利用可能な専門知識のパッケージです。
必要な専門知識を必要な時に必要な分だけ取り出せる整理システムみたいなもので、
図書館の司書が、質問を聞いて関連する本だけを的確に持ってきてくれるイメージです。

Skillsの特徴は↓です。

  • 自動検出: タスクに関連するSkillを自動で識別
  • 段階的読み込み: 必要最小限の情報だけをロード
  • 実行可能コード: 任意のスクリプトを含められる

Skillsの段階的読み込みは以下のように3段階で実施されるため、
効率よくコンテキストウィンドウを消費できます。

レベル 内容 トークン消費
第1段階 メタデータ(名前・説明)のみ 約100トークン/Skill
第2段階 SKILL.md全体(指示・例・ガイドライン) 通常は5,000トークン未満
第3段階 追加リソース(スクリプト・テンプレート・データ) 必要時のみ読み込み

この設計により、数百のSkillsを同時に利用可能な状態にしても、
メタデータのみがメモリに常駐するため、コンテキストウィンドウの圧迫を抑えられます。

ディレクトリ構造

Skillsの構成です。
以下のようにディレクトリへ配置します。

# グローバル(全プロジェクト使用)
~/.claude/skills/your-skill-name/
├── SKILL.md (必須)
└── (その他サポートファイル)

# プロジェクト固有の場合
<your project>/.claude/skills/your-skill-name/
├── SKILL.md (必須)
└── (その他サポートファイル)

複数のプロジェクトで共通して使用するSkillであれば、~/.claude/skills以下に作成します。
特定のプロジェクトのみであれば、プロジェクトディレクトリの.claude/skillsに作成します。

チームで共有する場合は、プロジェクトディレクトリに配置して
Gitなどで管理するのが良いかと思います。

SKILL.mdの構造

SKILL.mdはSkillsに必須のファイルで、YAMLフロントマターと
Markdown形式のコンテンツで構成されます。

---
name: skill-name
description: |
  スキルの説明。いつ使用するか。
  トリガーとなるフレーズやユースケースなどをシンプルに記述。
---

# Skill Documentation

## Instructions
手順やガイドライン

## Examples
具体的な使用例

スキル名もdescriptionも必須です。
descriptionはスキルの説明で、
Claudeがこのスキルを使うタイミングを判断するための情報になります。

Claude Code Subagent

概要

Claude Code Subagent(サブエージェント)は、
特定のタスクを自律的に実行する専門化されたAIアシスタントです。
メインの会話から独立したコンテキストウィンドウを持つのが特徴で、
専用のツールアクセスとシステムプロンプトで動作します。

特徴は以下です。

  • 独立したコンテキスト: メインの会話と完全に分離された専用のコンテキストウィンドウ
  • 選択的ツールアクセス: 必要なツールのみに制限可
  • 並列実行: 複数のSubagentを同時に実行可

特定ドメインに特化した役割を定義でき、複数並列に必要権限のみを与えた状態で、
各々が独立したコンテキストで動作することもできます。
なので、レビュアー、テスター、ドキュメント作成、実装者などのロールを与えられたSubagentが
同時にそれぞれのコンテキストで動くこともできます。

ディレクトリ構造

Subagent構成です。
Skillと似た感じですが、Subagentは1ファイルで完結します。
※必要に応じて同じディレクトリにスクリプトやテンプレート等を配置可能

# グローバル(全プロジェクト使用)
~/.claude/agents/agent-name.md

# プロジェクト固有の場合
<project-root>/.claude/agents/agent-name.md

# Plugin経由
<plugin>/agents/agent-name.md

Subagent定義ファイルの構造

Subagentは以下のような .md ファイルで定義します。
エージェント名は必須です。小文字とハイフンのみが使用できます。
descriptionも必須で、使用タイミングの説明を記述します。
skillsには自動でloadするSkillを記述します。

---
name: agent-name
description: いつ、なぜこのSubagentを使用するか
tools: Read, Grep, Glob, Bash  # オプション
model: sonnet  # オプション
skills: skill1, skill2  # オプション(自動読み込みするSkills)
---

Subagentのシステムプロンプト。
役割、能力、具体的な指示を記述...

SkillとSubagent

SkillとSubagent、どちらも共通している部分はあるのですが、
目的や機能は異なります。

Skillは「知識の提供」に特化し、メインのClaudeが必要に応じて自動的に参照します。
Subagentは「タスクの実行」に特化し、独立したコンテキストで自律的に動作します。

項目 Skill Subagent
目的 専門知識の提供 タスクの自律実行
実行方式 メインClaudeが参照 独立プロセスで実行
呼び出し 自動的に読み込み Taskツールで明示的に起動
コンテキスト メインと共有 独立したコンテキスト
状態 会話中継続的に参照 ステートレス

SkillとSubagentは連携して動作させることもできます。
Subagentの特徴である「独立した実行環境」でSkillを使うことができます。

Subagent A (プログラマー) → Skill-1 (tsプログラミング)
Subagent B (テスター) → Skill-2 (テスト実行)
Subagent C (AWSアーキテクト) → Skill-1 (tsプログラミング)、Skill-3(AWSシステム構築)

Skillの特徴である段階的読み込みにより、
各Subagentは必要な知識だけを効率的にロードします。

また、Subagentは複数並列に実行可能です。
例えば、ユーザーが「AWSを用いたシステムを構築」と依頼すると、
Claudeは自動的に複数のSubagent(定義されていれば)をオーケストレーションして処理を実行しようとします。

Claude Code Plugin

概要

Claude Code Pluginは、以下の機能をまとめてパッケージ化し、
配布できる仕組みです。

  • Slash Command: 頻繁に使用する操作のショートカット
  • Subagent: 特殊な開発タスク向けに構築されたエージェント
  • MCP Server: MCPプロトコルでツールやデータソースに接続
  • Hook: 任意のタイミング(Tool実行前など)でClaude Codeの動作をカスタマイズ
  • Skill: 専門知識のパッケージ

Pluginのディレクトリ構造

Pluginの構造は以下です。
必須なのはplugin.jsonのみ。
あとは要件にあわせて各種機能を組み合わせて配置します。

my-plugin/
├── plugin.json           # Plugin設定(必須)
├── README.md             # 説明(推奨)
├── commands/             # スラッシュコマンド
│   └── my-command.md
├── agents/               # サブエージェント
│   └── my-agent.md
├── skills/               # Skills
│   └── my-skill/
│       └── SKILL.md
├── mcp-servers/          # MCPサーバ設定
│   └── config.json
└── hooks/                # フック設定
    └── hooks.json

About plugin.json

必須ファイルであるplugin.jsonの内容です。
name,version,descriptionは必須です。

{
  "name": "my-plugin",
  "version": "1.0.0",
  "description": "プラグインの説明",
  "author": "作者名",
  "repository": "https://github.com/hoge/fuga",
  "license": "MIT",
  "keywords": ["code-review", "security"]
}

Create MarketPlace & Plugin

Skill、Subagent、Command、Hook、MCP serverを含む
Database Migration用のPluginを作成してみましょう。
「SQLite3でマイグレーション管理を自動化」というサンプル用プラグインを作ります。

1: マーケットプレイスとPluginディレクトリを作成

まず、ローカルにマーケットプレイス構造を作成します。
Claude Codeのpluginにおけるマーケットプレイスは、
複数のプラグインをカタログ化してまとめて配布・管理する仕組みです。
チームやコミュニティ単位で独自のマーケットプレイスを作成でき、
GitHub/ローカルパスなど柔軟なソースに対応しています。

なお、単一プラグインの場合はマーケットプレイスを使用せずとも
GitHubリポジトリを直接指定してインストール可能です。

% mkdir -p ~/dev-marketplace/plugins/database-migration-plugin
% cd ~/dev-marketplace/plugins/database-migration-plugin

# 各コンポーネントのディレクトリ
% mkdir -p skills/migration-best-practices
% mkdir -p agents commands hooks scripts db migrations

2: Skill を作成

データベースマイグレーションのベストプラクティスを定義するSkillを
skills/migration-best-practices/SKILL.md
として作成します。
(AIに生成させたサンプルです)

---
name: migration-best-practices
description: |
  データベースマイグレーションのベストプラクティス。
  スキーマ変更時に自動適用される。
---

# Database Migration Best Practices

## 命名規則

- ファイル名: `YYYYMMDDHHMMSS_description.sql`
- 例: `20250121120000_add_user_email.sql`

## マイグレーションルール

### UP Migration(適用)
- 必ずトランザクション内で実行
- カラム追加は`NOT NULL`制約に注意(デフォルト値を設定)
- インデックス作成は大規模テーブルでは段階的に

### DOWN Migration(ロールバック)
- すべてのUPに対応するDOWNを必ず用意
- データ損失の可能性がある変更は警告コメント必須

## 禁止事項

- 既存マイグレーションファイルの変更禁止
- 本番環境で直接DDL実行禁止
- カラム削除前にデータ確認必須

3: Subagent を作成

上記Skillを使用してマイグレーションを計画・生成するSubagent、
agents/migration-planner.mdを作成します。

---
name: migration-planner
description: データベーススキーマ変更を安全に計画。マイグレーション作成依頼時に使用。
tools: Read, Write, Grep, Glob, Bash
model: sonnet
skills: migration-best-practices
---

あなたはデータベースアーキテクトです。
migration-best-practices Skillに従って安全なマイグレーションを計画してください。

## マイグレーション生成手順

1. 既存スキーマを確認(migrations/ディレクトリ内のファイル)
2. 変更内容の影響を分析
3. migration-best-practices Skillの規則に従ってUP/DOWNを生成
4. タイムスタンプ付きファイル名で保存

## 注意点

- 破壊的変更(カラム削除、型変更)は警告を含める
- 外部キー制約の順序に注意
- インデックス作成は別マイグレーションに分離を推奨

4: Command を作成

次はカスタムスラッシュコマンド(commands/migrate.md)を作成します。
マイグレーションファイルを生成するコマンドです。

---
description: データベースマイグレーションファイルを生成
---

migration-plannerエージェントを使って、以下の変更に対するマイグレーションファイルを生成してください。

変更内容:
$ARGUMENTS

生成先: migrations/ディレクトリ

5: Hook を作成

マイグレーション実行前に確認プロンプトを表示するHook(hooks/hooks.json)を作成します。
$CLAUDE_PLUGIN_ROOTはプラグインのルートディレクトリを示す環境変数です。

{
  "description": "Migration safety check hook",
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "${CLAUDE_PLUGIN_ROOT}/scripts/migration-check.sh",
            "timeout": 30
          }
        ]
      }
    ]
  }
}

そして、Hook用のスクリプト(scripts/migration-check.sh)も作成します。
HookにはstdinでJSON形式のツール情報が渡されます。

#!/bin/bash

# stdinからJSONを読み取る
INPUT=$(cat)

# jqでfile_pathを抽出(jqがない場合はgrepで代替)
if command -v jq &> /dev/null; then
    FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
else
    FILE_PATH=$(echo "$INPUT" | grep -o '"file_path":"[^"]*"' | cut -d'"' -f4)
fi

# マイグレーションファイルかどうかチェック
if echo "$FILE_PATH" | grep -q "migrations/.*\.sql"; then
    echo "⚠️  データベースマイグレーション実行前の確認:" >&2
    echo "  - ロールバック手順は準備済みですか?" >&2
    echo "  - バックアップは取得しましたか?" >&2
    echo "  - 影響範囲を確認しましたか?" >&2
    exit 1  # exit 1: 警告表示してツール実行継続
fi

exit 0  # exit 0: 出力なし

なお、Hookの終了コードの意味は以下。

  • exit 0: 出力を表示しない
  • exit 1: stderrをユーザーに表示、ツール実行は継続
  • exit 2: stderrをモデルに表示、ツール実行をブロック

6: MCP Server設定

SQLite3データベースに接続するMCPサーバー設定を追加します。
plugin用ディレクトリのルートに.mcp.jsonを作成します。

{
  "mcpServers": {
    "sqlite": {
      "command": "uvx",
      "args": [
        "mcp-server-sqlite",
        "--db-path",
        "${SQLITE_DB_PATH:-./db/database.db}"
      ]
    }
  }
}

${SQLITE_DB_PATH}環境変数が設定されていればその値、未設定ならデフォルト値を使用します。

% export SQLITE_DB_PATH="./my-project/database.db"
OR
% SQLITE_DB_PATH="./my-db/data.db" claude

7: .claude-plugin/plugin.json を作成

すべてのコンポーネントをまとめるための、
プラグインマニフェストを作成します。

% cd ~/dev-marketplace/plugins/database-migration-plugin
% mkdir -p .claude-plugin

plugins/database-migration-plugin/.claude-plugin/plugin.jsonファイルを
以下のように作成します。

{
  "name": "database-migration-plugin",
  "version": "1.0.0",
  "description": "SQLite3マイグレーション管理を自動化するPlugin",
  "author": {
    "name": "Your Team"
  }
}

plugin.json.claude-plugin/ディレクトリ内に配置します。
他のコンポーネント(commands, agents等)はプラグインルートに配置するので注意。

8: プラグインをGithubにpush

作成したプラグインの構造は以下。

database-migration-plugin/                    
├── .claude-plugin/
│   └── plugin.json                          # プラグインマニフェスト
├── .mcp.json                                # MCP Server設定
├── agents/
│   └── migration-planner.md                 # Subagent
├── commands/
│   └── migrate.md                           # Slash Command
├── skills/
│   └── migration-best-practices/
│       └── SKILL.md                         # Skill
├── hooks/
│   └── hooks.json                           # Hook設定
└── scripts/
    └── migration-check.sh                   # Hookスクリプト

作成したプラグインをGitHubにアップロードします。
Githubでリポジトリを作成後、手順どおりにpushすればOKです。

これでマーケットプレイスとプラグインの準備は完了です。

Install Plugin

ここからはプラグインをインストールしたいリポジトリでの作業になります。
まずは、pluginのGitHubリポジトリURLを直接指定してインストールします。

% claude

# インストール
> /plugin install https://github.com/your-team/database-migration-plugin

# 確認
> /plugin

チームで使用する場合はチーム用リポジトリの
.claude/settings.json(または.claude/settings.local.json)
に設定を追加します。

% mkdir -p .claude

settings.local.jsonを以下の内容で作成。
enabledPluginsにはマーケットプレイスのURLを指定。

{
  "enabledPlugins": [
    "https://github.com/nakamura-shuta/dev-marketplace.git"
  ]
}

プロジェクトリポジトリから.claude/settings.jsonを取得後、
Claude Codeを起動すると自動的にプラグインのインストールが促されます。

# プロジェクトリポジトリを取得(clone)
# ※プラグインのリポジトリではないです
% cd your-project

# Claude Codeを起動
% claude

# 自動検出してインストールするか尋ねられる

また、以下のようにclaude code上の/pluginコマンドでもインストール・アップデート可能です。

> /plugin 
╭──────────────────────────────────────────────────────────────────╮
│ Plugins                                                          │
│                                                                  │
│ ❯ 1. Browse and install plugins                                  │
│   2. Manage and uninstall plugins                                │
│   3. Add marketplace                                             │
│   4. Manage marketplaces                                         │
╰──────────────────────────────────────────────────────────────────╯

インストールするにはAdd marketplace を選択して
マーケットプレイス用リポジトリのURLを入力します。

> /plugin 
╭──────────────────────────────────────────────────────────────────╮
│ Add Marketplace                                                  │
│                                                                  │
│ Enter marketplace source:                                        │
│ Examples:                                                        │
│  • owner/repo (GitHub)                                           │
│  • git@github.com:owner/repo.git (SSH)                           │
│  • https://example.com/marketplace.json                          │
│  • ./path/to/marketplace                                         │
│                                                                  │
│                                                                  │
╰──────────────────────────────────────────────────────────────────╯

そして、
Browse and install plugins
を選択すればプラグインのインストールができます。

プラグインを更新したいときは、
Manage and uninstall pluginsから
プラグインを選択してUpdate nowを実行すればOKです。

pluginの動作確認

Skill

Claudeが自動的にmigration-best-practices Skillを認識します。
※最初に適当なDBを作成しておいてください

以下のように指示をだすと、Claudeはmigration-best-practices Skillを使って
マイグレーションファイルを生成します。

> usersテーブルにemail列を追加するマイグレーションを作成して

Subagent

「エージェントつかって」と指示すれば、
migration-plannerサブエージェントでマイグレーションを計画します。

> migration-plannerエージェントを使って、
> postsテーブルにpublished_at列(DATETIME型、NULL許可)を追加するマイグレーションを作成

Custom Slash Command

カスタムスラッシュコマンドもプラグインに含まれるので、
/database-migration-plugin:migrateコマンドでマイグレーションを生成します。

> /database-migration-plugin:migrate usersテーブルにis_active列(BOOLEAN、デフォルト1)を追加

commands/migrate.mdが展開され、migration-plannerエージェントが起動します。
※プラグインのコマンドは/plugin-name:command-nameの形式で呼び出す

Hook

最後にHookの動作も確認してみます。
以下のようにマイグレーションファイルを作成依頼してみましょう。

> migrations/002_add_posts.sql を作成してCREATE TABLE postsの内容を書いてください

Hookが起動して、以下の警告が表示されます。

PreToolUse:Write says: Plugin hook error: ⚠️  データベースマイグレーション実行前の確認:
  - ロールバック手順は準備済みですか?
  - バックアップは取得しましたか?
  - 影響範囲を確認しましたか?

MCP Server

プラグインにはSQLite MCPサーバーの設定も含まれています。
以下のように現在のスキーマ情報を取得できます。

> hoge.dbの現在のテーブル構造を教えて

プラグインをインストールすることでMCPサーバも使用できるようになりました。

Summary

本記事では、Claude Code Skills・Subagent・Pluginの関係と、それらをパッケージ化する方法を解説しました。

Skills:

  • 専門知識をフォルダにまとめてClaudeに教える
  • SKILL.mdに指示とメタデータを記述
  • 3層の段階的開示でコンテキスト効率を最大化

Subagent:

  • 特定タスクを自律的に実行する専門エージェント
  • 独立したコンテキストで並列実行可能
  • オーケストレーションパターンで複雑なワークフローに対応

Plugin:

  • Skills・Subagent・スラッシュコマンド・MCP・フックをまとめて配布
  • 分散型マーケットプレイスで配布・共有
  • .claude/settings.jsonでエンタープライズ導入を標準化

5つの機能(Skill、Subagent、Command、Hook、MCP)をPluginにまとめることで、
特定分野のタスクに関して、一貫した手順で管理できます。

また、設定ファイル(settings.json)をリポジトリで共有することで、
プラグイン設定をチームで共有することもできます。

References

この記事をシェアする

FacebookHatena blogX

関連記事