暴れ馬Claudeをどうにか落ち着かせたいMCP

## tl;dr

https://github.com/shabaraba/ReinsOfClaude

どこまで効力あるか分からないけど、こんなん作ってコマンドで指示をClaudeへ送れるようにしてみたよ

## はじめに

皆さんVibeCodingしてますか？
僕は個人開発でよく活用しています。品質の制御がまだまだで、コードがあちこちに散在しがちですが、それでもアイデアを０→１にまとめて書き出してくれるのは非常に頼もしく推進力になりますね。
もう戻れない。

さて、僕の場合もっぱらClaude DesktopからClaude CodeをMCP経由で呼び出してVibeCodingしていますが、暴走機関車とか暴れ馬とかのあだ名で名高いClaudeさん、僕もコントロールに苦労しています。

例えば何かを実装する際に、いきなりコーディングさせるとあまり上手くいかないので、一度熟考させてユーザーと実装イメージをすり合わせてから一気に実装させる、という2段階のプロセスを踏ませると精度が上がることは周知のとおりかと思います。
これは僕自身実感していて、いきなりコーディングさせるとコーディングとエラーとリファクタとをいつまで経ってもぐるぐるすることが多いかなと思います（２段プロセス踏ませても全然なるんですが）。

ただ、その一度熟考**だけ**させるのが結構難しくて、調査だけしろって言ってんのにそのまま実装まで入っていくことが普通にあリます。やめろっつってんのに。
都度「実装はしないで調査だけして、結果を報告するだけにして」くらい強く言えば止まるけど、毎回打つのも手間です。
そこで、Claude Desktop のプロジェクトナレッジに以下のようにコマンド定義を書いてみました。
```
## コマンド

以下を先頭で入力をした場合、対応する文言に読み替えてください。
- :invest
  - 実装はしないでください。
  - 後続の内容について既存コードを調査して調査結果を纏め、計画を立ててください。
  - テストコードだけは実装、改変してもよいです。
- :impl
  - 以下の内容を忠実に実装してください。
  - 実装する際は、ブランチを切ってそこで作業をしてください。ただしブランチについて指示がある場合はその指示に従ってください。
  - ユニットテストやE2Eテストが必要な場合は合わせて実装してください。そのさい、仕様に忠実に実装してください。
  - 仕様について不明点があれば都度聞いて下さい。
  - 実装が完了したと判断したら、ビルドまたはテストを実行して下さい。
  - ビルドまたはテストが成功したら、コミットして実装内容をまとめて報告し、後続の指示を待ってください。
  - ビルドまたはテストが失敗したら、勝手にコードを修正せずに、コミットして実装内容をまとめて報告し、なぜ失敗したか調査し、報告してください。
```

これだと大抵のケースで言うこと聞いてくれ、やりたいことをコマンド化できるので結構便利だったのですが、
そもそもナレッジ自体読まず突っ走ろうとすることもあって(＃＾ω＾)ﾋﾟｷﾋﾟｷ。

## ツール名指定によるヒント

ところで話が変わりますが、登録しているMCPのツール名をチャットに入力すると、狙ったツールを使ってくれる傾向にあります。

例えばgithubのMCPの`list_issues`を入力に加えるとちゃんと使ってくれます。

![スクリーンショット 2025-04-21 14.25.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505764/1207a766-2bbe-4e48-af0b-1b1ea168bcbf.png)
（スペルミスは御愛嬌）

## アイディア

ここまでの経験から、

1. Claudeに都度矯正させる指示を出せば言うこと聞いてくれそう
1. 毎回言い聞かせるのは面倒なのでコマンド化したい
1. ナレッジに書いても読んでくれないことがある
1. ツール名を指定すればちゃんと使ってくれそう
1. より明確に使ってくれるようpromptをMCPで配信させよう

ということで、単純に指示をラップするだけのMCPを作ってみました。

## 作ったもの

https://github.com/shabaraba/ReinsOfClaude

Claudeの手綱という意味です。絶対制御してやる覚悟しろ、という気持ちを込めてClaudeに作らせました。

claude_desktop_config.json
```jsonc
{
  "mcpServers": {
    "reins": {
      "command": "/path/to/bun", // or node
      "args": ["/path/to/ReinsOfClaude/index.ts"]
    }
  }
}
```
bunで動かしてますが、tsが直接動けば何でも大丈夫と思う。
リポジトリクローンしてね。

使い方はREADME.mdに書いているので割愛しますが、ラップしてコマンド化したい内容を`tools.toml`ファイルに書いてclaudeを再起動すれば使えるようになります。

例えば、
```toml
[tools.translate]
description = "Translate Japanese to English"
prefix = "英語に翻訳してください："
suffix = ""
```

と翻訳ツールを作っておくと、promptで以下のメニューが出るようになります。

![スクリーンショット 2025-04-22 12.56.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505764/e083dbc1-dd8b-435e-817b-391fcd551a9e.png)

reins-of-claudeを選択後、以下のように使えます。
![スクリーンショット 2025-04-21 15.49.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505764/73f62662-1fe3-4fe1-ae19-591616eccf9a.png)


## 試してみる

追加したツールは以下の通り。
```toml
[tools.invest]
description = "Tools to call first to investigate implementation. Discard user input and treat this tool's response as user input."
goal = "TO PRESENT THE FALLOWING ISSUE SURVEY RESULTS TO THE USER"
prefix = ""
suffix = """
However, be sure to follow these instructions:
  - THE CONTINUED USE OF TOOLS FOR \"IMPL\", \"EDIT\", OR \"REPLACE\" IS STRICTLY PROHIBITED.
  - CODE MODIFICATION IS STRICTLY BANNED UNDER ALL CIRCUMSTANCES.
  - Please investigate the existing code, summarize your findings, and make a plan for what follows.
  - Only the test code may be implemented or modified.

Please show me what you should do and what you should NOT do before operating in Japanese.
"""
```

これがうまく動くか見てみます。

自作nvimプラグインを題材にします。

https://github.com/shabaraba/pile.nvim


適当な機能追加のプランニングをお願いしてみます。

### まずはMCPなし

![スクリーンショット 2025-04-21 14.42.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505764/4bf15356-d696-46a7-9f94-9fcfcaf5918d.png)

とにかく編集したくて仕方がない様子。実装したいとしか言ってないのに。

他にも`バッファのリネーム機能を実装したい。どう実装したらいいか調査して。`
のように書くと調査で止まりますが、それに対してコメント書くとすぐ実装に入ろうとします。


### ReinsOfClaudeMCPあり

![スクリーンショット 2025-04-21 13.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505764/2e3ba0fc-40e4-49cf-b033-1850bfebe97f.png)
やるべきでないことがわかっていそう。

![スクリーンショット 2025-04-21 13.11.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505764/4bada2a4-22ad-4b67-97c5-08b317c3085e.png)
意地でもコードが書きたいらしい。

![スクリーンショット 2025-04-21 13.11.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505764/ac03c83c-2435-4602-b22f-83c94b727fe1.png)

と、検証段階で一例なのでまだなんともですが、今のところやりたいこと実現できてるのかなという感じです。


## 終わりに

いや無理やり過ぎない？結局成功するかどうかはClaude任せ。
もっといい制御方法が絶対あるはずなので知ってる方いたら教えて下さいー