理系学生日記

おまえはいつまで学生気分なのか

GitHubリポジトリでClaude Plugin Marketplaceを作ってSlash CommandとMCP設定を配布する

Claude Codeを使っていると、便利なslash commandやMCPサーバの設定を他のプロジェクトでも使い回したくなる。でも毎回手作業でファイルをコピーしたり、設定を書き写したりするのは面倒だった。チームで共有しようとすると、READMEに手順を書いて「この設定を追加してください」と説明する必要があり、導入のハードルが高かった。

そんな中、AnthropicがPlugin Marketplaceという仕組みを発表した。GitHubリポジトリに決められたフォーマットでファイルを置くだけで、Slash CommandAgent Skills、MCPサーバ設定を配布できるらしい。

実際に作ってみたら、思いのほか簡単だった。この記事では、Conventional Commit用のslash commandとSerena MCPサーバを配布するまでの過程を書いていく。

Plugin配布の課題

Claude Codeは、Slash commandやMCPサーバを組み合わせると、開発フローがかなり効率化できる。Slash commandは.claude/commands/にMarkdownファイルを置けば使えるし、MCPサーバは/mcp addで追加できる。仕組み自体はシンプルでわかりやすい。

ただ、これを他の人に使ってもらおうとすると面倒なことになる。GitHubでslash commandを公開しても、利用者は手動でファイルをダウンロードして適切な場所に置かないといけない。MCPサーバはもっと大変で、JSON設定を正確にコピーしてもらって、環境変数の設定も説明する必要がある。チームで標準化しようとすると、導入手順を細かく書く必要があって、これがまた手間だった。

こういう配布の面倒さを解決する仕組みが、Plugin Marketplaceだ。

Plugin Marketplaceは、GitHubリポジトリに決められたディレクトリ構造でpluginを置いて、メタデータを書けば、それでmarketplaceになる。npmやHomebrewみたいに、誰でもmarketplaceを立ち上げられる。利用者は/plugin installコマンドだけで済む。

Marketplaceを作ってみた

リポジトリの準備

まず、GitHubに新しいリポジトリを作った。名前はclaude-plugins

Marketplaceの構造は、Plugin directory structureで定義されている。各プラグインを規定のディレクトリ構造で置いて、.claude-plugin/marketplace.jsonにmarketplaceのメタデータを書く形になる。

実際に作ったディレクトリ構成はこんな感じ。

git ls-files | grep -vE '^(\.devcontainer/|\.gitignore$|\.prettierrc\.json$|LICENSE$|README\.md$)' | tree --fromfile -a
.
├── .claude-plugin
│   └── marketplace.json
└── plugins
    └── common-dev-essentials
        ├── .mcp.json
        ├── commands
        │   └── commit.md
        └── plugin.json

5 directories, 4 files

プラグインのディレクトリ構成

プラグインは、こういうディレクトリ構造になる。

plugin-root/
├── commands/                # Slash commands
├── agents/                  # Subagents
├── skills/                  # Agent Skills
│   ├── code-reviewer/
│   └── pdf-processor/
├── hooks/                   # Hook configurations
├── .mcp.json                # MCP server definitions
├── plugin.json              # Plugin metadata

プラグインのルートに、commands/とかagents/とかskills/とかのディレクトリを置けば、Claude Codeが勝手に認識してくれる。

plugin.jsonにはプラグインのメタデータを書く。標準構成に従ったので、必要最小限の情報だけで済んだ。

{
  "name": "common-dev-essentials",
  "description": "Essential utilities and workflow enhancements for any development project",
  "version": "0.2.0",
  "author": {
    "name": "kiririmode"
  },
  "homepage": "https://github.com/kiririmode/claude-plugins",
  "repository": "https://github.com/kiririmode/claude-plugins",
  "license": "MIT",
}

marketplace.json

次に、.claude-plugin/marketplace.jsonでmarketplaceのメタデータを書く。

各プラグインには、plugins[].nameplugins[].sourceが必須になる。nameplugin.jsonnameと対応させる。sourceには、プラグインのディレクトリパスを指定する。今回はローカルのファイルパスにしたけど、外部のGitHubリポジトリも指定できる。

{
  "name": "kiririmode-claudecode-plugins",
  "owner": {
    "name": "kiririmode",
    "email": "kiririmode@gmail.com"
  },
  "metadata": {
    "description": "A curated collection of Claude Code plugins used by kiririmode for everyday development workflows. This marketplace provides practical tools and integrations to enhance development productivity.",
    "version": "0.1.0",
    "pluginRoot": "./plugins"
  },
  "plugins": [
    {
      "name": "common-dev-essentials",
      "source": "./plugins/common-dev-essentials",
      "strict": true
    }
  ]
}

Pluginの作成

marketplace.jsonができたので、次は実際に配布するプラグインを作る。

今回は、開発プロジェクト全般で使える汎用的なプラグインということで、common-dev-essentialsという名前にした。このプラグインには、Conventional Commit用のslash commandと、Serena MCPサーバの設定を入れる。

Conventional Commit slash commandの作成

まず、Conventional Commit形式のコミットメッセージを自動生成するslash commandを作った。

コミットメッセージの書き方を統一するのはいつも面倒なので、git diffから自動的にConventional Commit形式のメッセージを生成させることにした。Slash Commandの作り方は、Slash commands - Claude Docsに詳しく載っている。

---
allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*), Bash(git diff:*)
description: Analyze changes and create commits in Conventional Commits format, split into logical units
---

このコマンドは、現在の変更を分析し、論理的な単位に分割して日本語のコミットメッセージを生成します。

# コンテキスト

- 現在の git status: !`git status`
- 現在の git diff (ステージ済みと未ステージの変更): !`git diff HEAD`
- 現在のブランチ: !`git branch --show-current`
- 最近のコミットスタイルの確認: !`git log --oneline -10`

## 実行手順

1. **変更の分類と Conventional Commits タイプの決定**
   変更を以下のような論理的な単位に分類し、適切な Conventional Commits タイプを選択してください:
   - **feat**: 機能追加(新しい機能の実装)
   - **fix**: バグ修正(既存機能の不具合修正)
   - **refactor**: リファクタリング(動作を変えずにコードを改善)
   - **docs**: ドキュメント更新(README、コメント、docstring等)
   - **test**: テスト追加/修正
   - **chore**: 設定変更(CI/CD、開発環境、ビルドプロセス等)
   - **perf**: パフォーマンス改善
   - **style**: コードスタイルの修正(フォーマット、空白等)
   - **build**: ビルドシステムや外部依存関係の変更
   - **ci**: CI設定ファイルやスクリプトの変更

2. **コミットメッセージの生成(Conventional Commits 形式)**
   各論理的な単位について、以下の形式で日本語の Conventional Commits メッセージを作成してください:

(略)

このファイルをcommon-dev-essentials/commands/commit.mdとして保存した。プラグインをインストールすれば、Claude Codeから/commitコマンドが使える。

Serena MCP サーバ設定の作成

次に、MCPサーバの設定を作った。MCPサーバの設定も、プラグインとして配布できる。.mcp.jsonという隠しファイルとして置く形だ。

{
    "mcpServers": {
        "serena": {
            "command": "uvx",
            "args": [
                "--from",
                "git+https://github.com/oraios/serena",
                "serena",
                "start-mcp-server",
                "--context",
                "ide-assistant",
                "--project",
                "${PROJECT_ROOT}"
            ],
            "env": {
                "PROJECT_ROOT": "${PWD}"
            }
        }
    }
}

リポジトリの公開

プラグインができたら、GitHubにpushする。これでmarketplaceが完成して、https://github.com/kiririmode/claude-pluginsがmarketplace URLとして使えるようになる。

実際に使ってみた

Marketplaceの登録

作ったmarketplaceを、Claude Codeに登録する。/plugin marketplace addコマンドを使う。コマンドを忘れたら、/pluginだけ入力すれば、選択肢が出てくる。

> /plugin marketplace add kiririmode/claude-plugins
  ⎿  Successfully added marketplace: kiririmode-claudecode-plugins

marketplaceを追加すると、リポジトリの内容が$HOME/.claude/plugins/marketplaces/kiririmode-claudecode-pluginsに展開される。ただ、この段階ではまだpluginは使えない。次にインストールが必要になる。

/plugin install <プラグイン名>でpluginをインストールする。インストール後、Claude Codeを再起動すると有効化される。

> /plugin install common-dev-essentials 
  ⎿  ✓ Installed common-dev-essentials. Restart Claude Code to load new plugins.

再起動すると、<プラグイン名>:スラッシュコマンド名という形式でslash commandが使えるようになる。

> /commit
─────────────────────────────────────────────────────────────────────────────────
  /common-dev-essentials:commit     Analyze changes and create commits in
                                    Conventional Commits format, split into
                                    logical units (plugin:common-dev-essentials
                                    @kiririmode-claudecode-plugins)

MCPサーバも勝手に設定されている。

> /mcp
╭───────────────────────────────────────────────────────────────────────────────╮
│ Manage MCP servers                                                            │
│                                                                               │
│ ❯ 1. plugin:common-dev-essentials:serena            ✔ connected · Enter       │
│                                                     to view details           │

Marketplaceの利点

実際に使ってみて、いくつか良い点があった。

まず、配布が簡単。.claude-plugin/marketplace.jsonにメタデータを書いて、プラグインのディレクトリを規定の構造で置くだけ。特別なサーバーとかインフラは不要で、GitHubリポジトリに置けば誰でもアクセスできる。

次に、複数の機能をパッケージ化できるのが便利だった。今回のcommon-dev-essentialsでは、Slash commandとMCPサーバの設定を1つのプラグインにまとめた。利用者は/plugin install common-dev-essentialsだけで、/commitコマンドとSerena MCPサーバの両方が使えるようになる。関連する機能をセットで配布できるのは、手動設定では難しかったことだ。

それから、チーム内での共有が現実的になった。これまでは「この設定ファイルをコピーして」「環境変数をこう設定して」という手順をREADMEに書いてたけど、marketplace URLを共有するだけで済むようになる。新しいメンバーが入っても、/plugin marketplace add/plugin installの2コマンドで環境を揃えられる。

MCPサーバの設定を.mcp.jsonで配布できるのも大きい。プラグインとして配布すれば勝手に設定される。環境変数の置換も${PWD}とか${PROJECT_ROOT}で書けるので、プロジェクトごとの設定も柔軟に扱える。

まとめ

Claude Code Plugin Marketplaceを構築して、Conventional Commit用のslash commandとSerena MCPサーバを配布してみた。作業としては、GitHubリポジトリに決められたディレクトリ構造でファイルを置いて、marketplace.jsonplugin.jsonを書くだけだった。

実際に使ってみると、plugin配布のハードルが大きく下がった。slash commandは手動でファイルをコピーする必要がなくなったし、MCPサーバは.mcp.jsonで設定を配布できるようになった。複数の機能を1つのプラグインにまとめられるので、関連するツールをセットで提供できる。

今後は、チーム用のmarketplaceを育てていきたい。プロジェクト固有のslash commandとか、よく使うMCPサーバの設定とか、開発フローを効率化するAgent Skillsとかを追加していけば、チーム全体の生産性が上がりそうだ。Marketplaceの仕組みがあることで、こうした社内ツールの共有が現実的になった。