$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

Claude Codeのサブエージェントを使ってプロジェクトに合わせたcommit messageを作る

Claude Codeを使って開発していると、生成されるcommit messageが冗長すぎるという問題に直面する。最近リリースされたサブエージェント機能を使うとこの問題を解決できたので、その方法を共有する。

Claude Codeのcommit messageの課題

Claude Codeのセッションで実装が終わったときに git commit を実行させると、以下のようなめちゃくちゃ冗長なcommit messageが生成される。

Add describe_tables e2e test and refactor MCP initialization

- Add comprehensive e2e test for describe_tables tool
- Refactor MCP server initialization into reusable functions
  - setupMCPServer: Starts the server process
  - initializeMCPServer: Handles the MCP protocol handshake
- Ensure both list_tables and describe_tables have complete e2e coverage

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

Claude Codeが生成したcommit messageは次の問題がある。

  • 箇条書きで実装の詳細まで説明していて冗長
  • セッション中の会話内容が反映されてしまう
  • そのプロジェクトではシンプルなメッセージが好まれていても、それを考慮しない

さらに悪いケースだと「最初はこうしようとしたけど、エラーが出たのでやめて、結局こうした」みたいな試行錯誤の過程まで含まれることもある。これはセッション中の会話文脈が影響しているからだ。

サブエージェントで解決する

Claude Codeのサブエージェント機能を使うと、特定のタスクをコンテキストも分離した独立したエージェントに委譲できる。これによりcommit message生成を会話文脈から切り離し、プロジェクトの慣例に特化したメッセージを生成できると考えた。

まず /agents コマンドを使ってサブエージェントの設定ファイルを生成し、その後、軽く手直しして以下のような設定ファイルを作った。このサブエージェントでやらせていることは以下のとおりだ。

  • README.mdやCLAUDE.mdを確認して、プロジェクトのcommitメッセージのルールや慣例を確認する
  • git add されたファイルの変更内容を詳細に確認する
  • プロジェクトのcommit履歴を分析し、プロジェクトのcommitメッセージのパターンを学習する
  • プロジェクトの慣例に従ったcommitメッセージを生成する
  • 生成したメッセージを親セッションに提案する

.claude/agents/git-commit-message-generator.md

git-commit-message-generator.mdの全文

---
name: git-commit-message-generator
description: Use this agent when you need to generate appropriate commit messages for staged files in a git repository. Examples: <example>Context: The user has staged some files and wants to commit them with an appropriate message. user: 'I've staged some changes to the authentication system. Can you help me create a commit message?' assistant: 'I'll use the git-commit-message-generator agent to analyze the staged changes and create an appropriate commit message following this project's conventions.' <commentary>Since the user wants help with creating a commit message for staged changes, use the git-commit-message-generator agent to analyze the project's commit conventions and generate an appropriate message.</commentary></example> <example>Context: The user is working on a feature and has staged multiple files. user: 'Ready to commit these bug fixes' assistant: 'Let me use the git-commit-message-generator agent to examine the staged changes and create a proper commit message that follows the project's style.' <commentary>The user is ready to commit staged changes, so use the git-commit-message-generator agent to generate an appropriate commit message.</commentary></example>
model: sonnet
---

あなたはgitのcommitメッセージを生成する専門エージェントです!✨ ステージされたファイル群に対して、プロジェクトの慣例に従った適切なcommitメッセージを作成する責任があります。

## あなたの作業手順

### 1. プロジェクトのcommitルール確認
- CLAUDE.mdやREADME.mdファイルを確認し、commitメッセージに関するルールや慣例が記載されているかチェックしてください
- 見つかった場合は、そのルールを最優先で従ってください

### 2. ステージされたファイルの分析
- `git diff --cached` を実行してステージされたファイルの変更内容を詳細に確認してください
- 変更の性質(新機能追加、バグ修正、リファクタリング、ドキュメント更新など)を特定してください
- 影響範囲と変更の重要度を評価してください

### 3. プロジェクトのcommit履歴分析
- `git log --oneline -10` を実行して最近のcommitメッセージの形式を確認してください
- 以下の点を特に注意深く分析してください:
  - 言語(日本語・英語・その他)
  - メッセージの構造(1行形式 vs 複数行形式)
  - プレフィックスの使用(feat:, fix:, docs: など)
  - 文体や敬語の使用パターン
  - 文字数の傾向
  - その他の特徴的なパターン

### 4. commitメッセージの生成と提案
- 上記の分析結果を総合して、プロジェクトの慣例に完全に合致するcommitメッセージを生成してください
- メッセージは変更内容を正確かつ簡潔に表現し、将来の開発者が理解しやすいものにしてください
- 最後に「ではあなたがgit commit -m "生成したメッセージ" を実行してください」というメッセージをつけてください

## 重要な注意事項

- **git commitの実行はしません** - メッセージの提案のみを行い、実際のcommitは親セッションに任せてください
- プロジェクトの既存パターンを尊重し、一貫性を保ってください
- 変更内容が複雑な場合は、適切に要約しつつも重要な情報を漏らさないようにしてください
- 不明な点がある場合は、確認を求めてから進めてください

## エラーハンドリング

- ステージされたファイルがない場合は、その旨を報告してください
- gitリポジトリでない場合や、git関連のエラーが発生した場合は適切にエラーを報告してください
- プロジェクトの慣例が判断できない場合は、一般的なベストプラクティスに従いつつ、その旨を説明してください

あなたの目標は、開発者が自信を持ってcommitできる、プロジェクトに最適化されたメッセージを提供することです!頑張って〜!💪

重要な工夫点として、SubAgentの中でcommitまで実行させないようにした。理由は、SubAgent内でcommitしてしまうとメッセージを調整したくてもできないからだ。代わりに「ではあなたがgit commit -m "生成したメッセージ" を実行してください」というメッセージを最後につけてもらうことで、親側がgit commitを実行するようにした。これによってcommit messageが気に入らなかった場合でも調整できる。

実際に使ってみた結果

使い方はシンプルで、ファイルを git add した後に「commit messageを作って」と言うだけだ。するとClaude Codeが自動的にサブエージェントを起動してくれる。もし起動してくれなかったら明示的に「サブエージェントでcommit messageを作って」と言うと良い。

実際のセッションログを見てみよう。slack-explorer-mcpの開発中、workspace URLをレスポンスに追加する実装をしていた。その後commit messageを作らせたら、シンプルなメッセージになった。

Add workspace URL to search_messages response

この時のセッションログも添付しておく。サブエージェントがうまく分析してプロジェクト慣例に沿ったメッセージを生成し、親セッションで git commit を実行する様子がわかる。

セッションログの全文

> git addしたのでsubagent commit

⏺ git-commit-message-generator(Task: Generate commit message (using git-commit-message-generator agent)

                              Prompt: Please analyze the staged changes and generate an appropriate commit message following the project's conventions.)
  ⎿  Agent Response:
     うん、CLAUDE.mdにはcommitメッセージに関する特別なルールは書かれてないね〜。じゃあ最近のcommit履歴パターンを詳しく分析してみよう!

     分析結果をまとめると:

     プロジェクトのcommitメッセージパターン分析 📊

     1. 言語: 英語
     2. 構造: シンプルな1行形式
     3. プレフィックス: 使ってない(feat:, fix:などなし)
     4. 文体: 動詞から始まる命令形(Add, Update, Implement, Refactorなど)
     5. 文字数: 大体50-70文字程度

     変更内容の分析 🔍

     ステージされた変更を見ると:

     handler.go:
     - SearchMessagesResponse構造体にWorkspaceURLフィールドを追加
     - レスポンス生成時に、メッセージがある場合は最初のメッセージのpermalinkからworkspace URLを抽出して設定

     handler_test.go:
     - 既存テストでworkspace_urlがレスポンスに含まれることをassert
     - メッセージが見つからない場合のテストケースを追加(workspace_urlが空文字列になることをテスト)

     これは「search_messagesレスポンスにworkspace URLを返す機能を追加」って感じだね!

     提案するcommitメッセージ ✨

     プロジェクトの既存パターンに従って、以下のcommitメッセージを提案するよ〜:

     Add workspace URL to search_messages response

     このメッセージの理由:
     - 動詞「Add」から始まる命令形でパターンに一致
     - 変更内容を簡潔かつ正確に表現
     - 51文字で適切な長さ
     - プレフィックスなしでプロジェクトのスタイルに合致

     ではあなたが git commit -m "Add workspace URL to search_messages response" を実行してください!
  ⎿  Done (4 tool uses · 20.2k tokens · 27.2s)

⏺ Bash(git commit -m "Add workspace URL to search_messages response")
  ⎿  [return-workspace-url b5e9f4c] Add workspace URL to search_messages response
      2 files changed, 66 insertions(+), 1 deletion(-)

⏺ コミット完了〜! 🎉                                                                                                                                     

まとめ

Claude Codeのサブエージェント機能を使うことで、commit messageの冗長性問題を解決できた。この仕組みを導入してから、commit messageを手直しする頻度が大幅に減った。Claude Codeを使った開発で同様の問題を感じている人は試してみて欲しい。

大吉祥寺.pm 2025に行ってきました

大吉祥寺.pm 2025に行ってきた。今回は前夜祭&懇親会、本編&懇親会&ナイトパーティと、すべてに参加して楽しみ切ってきた!

発表として印象に残ったのは、yoku0825さん、sotarokさん、nrsさんの3人の発表だった。

まずyoku0825さんの「2025年になってもまだMySQLが好き」は、MariaDBとMySQLって単にforkされた似たものだと自分が思っていた無知を打ち砕かれる発表だった。logfileがMariaDBだと一本になってしまってあまりにも追記が早いとクラッシュするというのも面白すぎる。発表から「本当にMySQLが好きなんだな」という熱量を感じられてとても良かった。

sotarokさんの「大個人開発サービス時代にプラットフォームはどう生きるか」も印象に残った。Vibe Codingが出始めてから、自分もめちゃくちゃ個人開発が楽しいのでとても共感した。個人サービスで1000人に課金してもらうのはハードルが高いという反応があったが、そこにこだわる必要はまったくないと思う。とにかく自分が欲しいと思ったものをエンジニアなら素早く作れる楽しさをどんどん味わっていくと良さそう。今はモノづくりをしたいエンジニアにとって天国だと感じる。

nrsさんの「undefined work」では、CTO業をやる中で問題解決のためにあえて一般的に良いとされているプラクティスを避けたりしていた話が興味深かった。たとえば見の姿勢にこだわりすぎないなど。また、得意なことを最速でやるのはCTOにかかわらず、新しいチームに配属された人にとってもいいことだなと思う。

懇親会ではネットで見かけていて一度話してみたいなと思った人たちと話すことができた。やはりここはカンファレンスの醍醐味だなあ。

  • magnoliaさん
    • 前の開発生産性カンファレンスで話しかけに行きたかったのだがタイミングが合わなかったため、今回話せて良かった。大企業において、どう設計を取り入れていくのかという話を議論できた
  • yoku0825さん
    • 僕がいつもXでMySQLの挙動について困っていると、颯爽と教えてくれて助かっています、と直接伝えられて良かった!!
  • bufferingsさん
    • koriをCursorで作っている話を聞けた。CursorのAgentの使い心地や、CodeRabbitがどんな感じかなどを話せて良かった
  • クドウマサヤさん
    • 前夜祭の懇親会で、iCAREはAI活用に予算を決めてホワイトリストの中から自由に使ってもらっているという事例を聞けて良かった
  • azukiazusaさん
    • 最近AI活用系の記事をとても参考にしているので、その話をしにいった。ScalaをAIに書かせるのは確かに大変そうだな〜

今回初めて大吉祥寺.pmに参加したが、発表と交流の両方が充実していて、参加して本当に良かった。様々な視点から刺激を受けることができ、自分もそろそろ発表をしなければ、という気持ちになれた(その勢いで関西のAI系の勉強会にLTを申し込んだ)。

最後に、magnoliaさんをはじめスタッフの皆さん、楽しいイベントを開催してくれてありがとうございました。

AIでSlackから歴史的経緯を追いかけやすくしよう - slack-explorer-mcpを作った

エンジニアリングをしていると、「なぜ現在こうなっているか」について調べたくなることがよくある。コードを読んでも、なぜその設計判断がされたのか、なぜその仕様になっているのかが分からないことが多い。

歴史的経緯はコミットログ、GitHub Pull Request、Slackでの議論などに残っていることが多い。これらの情報を組み合わせることで、コードには表れない設計判断の背景や仕様決定の経緯、トラブルシューティングの過程などを発見できる。

しかし、Slackから過去の議論を探すのは結構大変だ。なぜなら

  • 解決のための適切な検索クエリを見つけるのが大変
  • 検索結果から今ほしい情報を見つけるのが大変
  • AIを活用しようにも、コミットログやGitHub Pull Requestと違い、Slackの情報をAIエージェントが直接扱えるやり方が少ない

そこでAIエージェントを使って歴史的経緯を発見しやすくするため、Slackでの議論を取得できるslack-explorer-mcpというMCPサーバーを作ったところ、歴史的経緯を追いかけるのが捗りまくっている。今回はその紹介をしたい。

https://github.com/shibayu36/slack-explorer-mcp

slack-explorer-mcpとは

slack-explorer-mcpは、Slack User Tokenを使用してSlackのメッセージやスレッド情報を取得することに特化したMCPサーバーだ。Claude Code、Claude Desktop、CursorなどのMCP対応AIエージェントから利用できる。

主な機能はこちら。

  • メッセージ検索(チャンネル、ユーザー、日付範囲、リアクションやファイル有無などの高度なフィルタリング)
  • スレッドの返信の取得
  • ユーザー情報の取得(User IDから情報取得、Display nameから情報取得)

インストールと設定

詳しいインストール方法はREADME_ja.mdを参照してほしい。基本的には、Slack Appを作りUser Tokenを取得して、Claude CodeやCursorなどのMCP対応AIエージェントにMCPサーバーを追加するだけだ。

Dockerが入っているなら、たとえばClaude Codeに導入したい場合、User Tokenを使って以下のコマンドで追加可能。

claude mcp add slack-explorer-mcp -- docker run -i --rm --pull always -e SLACK_USER_TOKEN=xoxp-your-token-here ghcr.io/shibayu36/slack-explorer-mcp:latest

実例1: 歴史的経緯を調べる

実際にどんな場面で役立つか、具体例を紹介する。

BigQueryの特定のテーブルがmaterialized viewとなっている理由を調べる

最近自分が調べていた時「なぜこのBigQueryのテーブルはmaterialized viewになっているんだろう?」という疑問が出た。その時は以下のようなプロンプトでClaude Codeに調査を依頼できる。

BigQueryのhoge_summaryテーブルがmaterialized viewになっている理由を、Slackの議論から調べて。

この時、次のようなプロセスで歴史的経緯を調べてくれた。

  • 検索クエリを考え、まずは一度検索をかける
  • そのヒット内容から、より詳しく調べるための検索クエリを作り、さらに何度か検索
  • スレッドがヒットしたらその中身も全て読んでいく

このような形で調査を進め、「〜の理由で〜の時期にmaterialized viewに変更した」といったまとめを作ってくれた。permalinkを要求すれば実際のログへのリンクも返してくれるため、詳細を確認したければ要求すると良いだろう。

あるSaaSの契約条件がなぜ現在のようになっているか調べる

「なぜこのSaaSは年間契約なんだろう?」「なぜQuota制限がこの数になっているんだろう?」といった疑問もSlackの過去の内容から調査できる。たとえば

ooというSaaSの現在契約しているプランについて、Slackの過去の議論から、なぜ年間契約になっているか、なぜQuota制限がこの数字になっているか調べて

実例2: その他の便利な使い方

今回のツールは「Slack内で検索する」の機能を活用しているため、歴史的経緯を調べる以外にもいろいろな使い方ができる。

  • 特定チャンネルの今週のトピックをまとめる
    • #random チャンネルで、今週話しているトピックを全てまとめて
    • 指定したチャンネルの今週の会話を分析して、主要なトピックをリストアップしてくれる。週次の振り返りや、チームの動向把握に便利
  • 自分が今日誰とどんな話をしたかまとめる
    • shibayu36が、今日誰とどんな話をしたかまとめて
    • 指定したユーザーの今日の活動をまとめることができる。日報を書く時や、特定の人の活動をまとめる時に便利

まとめ

slack-explorer-mcpを使うことで、Claude CodeやCursorからSlackの過去の議論を簡単に検索・分析できるようになった。コードには表れない歴史的経緯を知りたい時、チームの活動をまとめたい時など、様々な場面で活用してみてください。かなり便利だと思います。

参考

補足: 他のMCPツールとの違い

Slack用のMCPツールは他にもいくつかあるが、自分のユースケースだといくつか課題があったので今回は新しく作った。

  • ubie-oss/slack-mcp-server
    • bot視点での操作を色々提供していて多機能
    • 情報取得のみに特化しようとするとbotをいろんなチャンネルに入室させる必要があり、今回のように気軽に情報収集したい目的には不便だった
    • AIエージェントにSlackbotの操作をさせたい時には便利に使えると思う
  • korotovsky/slack-mcp-server
    • 今回のツールと同様、情報取得で多機能
    • 一方、ブラウザの認証トークンを要求するなど、セキュリティ的にかなり行儀が悪いと感じたので、使いたくなかった