Claude Codeプラグイン開発 — Skills+Hooks+MCPをパッケージ化
約6分で読めます
プラグインとは何か
Claude Codeプラグインは、Skills、Hooks、MCPサーバー、サブエージェント設定を1つのインストール可能なパッケージにまとめたもの。チーム内で共有したり、コミュニティに公開して再利用できる。
プラグインのディレクトリ構造
my-plugin/
├── package.json # メタデータ・依存関係
├── README.md # 使い方ドキュメント
├── skills/
│ ├── SKILL_NAME.md # スキル定義ファイル
│ └── templates/ # スキルが使うテンプレート
├── hooks/
│ ├── pre-commit.sh # コミット前チェック
│ └── on-save.sh # ファイル保存時の処理
├── mcp/
│ ├── server.py # MCPサーバー実装
│ └── tools.py # カスタムツール定義
├── agents/
│ └── reviewer.md # サブエージェント定義
└── install.sh # インストールスクリプト
各ディレクトリは省略可能。Skillsだけ、Hooksだけのプラグインも有効。
package.json の設定
{
"name": "claude-plugin-code-review",
"version": "1.0.0",
"description": "自動コードレビュープラグイン",
"author": "your-name",
"license": "MIT",
"claude-plugin": {
"type": "skills+hooks+mcp",
"minVersion": "1.0.0",
"permissions": [
"file:read",
"file:write",
"network:localhost"
],
"skills": ["skills/*.md"],
"hooks": {
"pre-commit": "hooks/pre-commit.sh",
"on-save": "hooks/on-save.sh"
},
"mcp": {
"server": "mcp/server.py",
"tools": ["code_review", "suggest_fix"]
}
},
"dependencies": {
"anthropic": "^1.0.0"
}
}
claude-pluginフィールドがプラグインの核。permissionsで必要な権限を明示し、ユーザーがインストール時に確認できるようにする。
Skillファイルの書き方
---
name: code-review
description: コードの品質レビューを実行する
trigger: /review または「レビューして」
---
# Code Review Skill
## 手順
1. 変更されたファイルをgit diffで取得
2. 各ファイルに対して以下を確認:
- 命名規則の一貫性
- エラーハンドリングの有無
- テストカバレッジ
3. 問題点をリスト化して報告
4. 自動修正可能なものは修正案を提示
## 出力形式
- PASS: 問題なし
- WARN: 軽微な問題あり(修正推奨)
- FAIL: 重大な問題あり(修正必須)
Hookの実装例
#!/bin/bash
# hooks/pre-commit.sh
# コミット前に型チェックとlintを実行
echo "[Plugin] Running pre-commit checks..."
# TypeScriptの型チェック
if command -v tsc &> /dev/null; then
tsc --noEmit
if [ $? -ne 0 ]; then
echo "Type check failed. Commit aborted."
exit 1
fi
fi
# ESLint
if command -v eslint &> /dev/null; then
eslint --fix $(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(ts|tsx|js|jsx)$')
fi
echo "[Plugin] All checks passed."
exit 0
MCPサーバーの実装
# mcp/server.py
from mcp import Server, Tool
app = Server("code-review-mcp")
@app.tool("code_review")
async def code_review(file_path: str, context: str = "") -> dict:
"""指定ファイルのコードレビューを実行"""
with open(file_path, "r") as f:
code = f.read()
# AIによるレビュー実行
review = await analyze_code(code, context)
return {
"status": review.severity,
"issues": review.issues,
"suggestions": review.suggestions
}
@app.tool("suggest_fix")
async def suggest_fix(file_path: str, issue_id: str) -> dict:
"""検出された問題の修正案を生成"""
fix = await generate_fix(file_path, issue_id)
return {"patch": fix.diff, "explanation": fix.reason}
インストールスクリプト
#!/bin/bash
# install.sh
PLUGIN_DIR="$HOME/.claude/plugins/code-review"
mkdir -p "$PLUGIN_DIR"
cp -r skills/ "$PLUGIN_DIR/skills/"
cp -r hooks/ "$PLUGIN_DIR/hooks/"
cp -r mcp/ "$PLUGIN_DIR/mcp/"
cp package.json "$PLUGIN_DIR/"
# Hookの登録
chmod +x "$PLUGIN_DIR/hooks/"*.sh
echo "Plugin 'code-review' installed to $PLUGIN_DIR"
echo "Restart Claude Code to activate."
公開手順
- テスト: ローカルでインストールして動作確認
- ドキュメント: README.mdに使い方・設定方法を記述
- バージョニング: semverに従い
package.jsonのversionを更新 - 公開: GitHubリポジトリとして公開し、READMEにインストールコマンドを記載
- 配布:
git clone+./install.shでワンコマンドインストール
プラグイン設計のベストプラクティス
| 原則 | 説明 |
|---|---|
| 単一責任 | 1プラグイン1機能に絞る |
| 権限最小化 | 必要な権限だけ要求する |
| フォールバック | 依存ツールがない場合もエラーにしない |
| 設定可能 | ハードコードせずconfig対応にする |
| ドキュメント | スキルのtriggerと効果を明記する |
関連記事
A
Agentive 編集部
AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。