MCPを活用したコマンド管理システムの開発

March 01, 2025

概要

Cursorとのやり取りがなかなか安定しない(指示とずれたり、違う方向にズンズン進んでしまう)ので、それを改善するためにMCPを活用してみた。

背景

cursorrulesやprojectrulesを使っても、なかなか挙動が安定しないことが多かった。

なので、今まではいかのようにやってた

  • roles.mdのようなファイルを定義
  • roles.mdの中身はコマンドとそのコマンド定義
  • 毎回のやり取りでコンテキストにroles.mdを渡しつつ、定義したコマンドから使いたいコマンドを投げる

上記で精度は上がってる気はするものの、やり取りのたびに渡すのは面倒くさくて、かつやっぱり長文をコンテキストで渡すので、挙動が安定しないことがあった。

MCPを使ったら解消できるかな?と思ったので、MCPを立ててみた。

やってることの大まかな流れは以下

  • DBにコマンド名とコマンドの定義を登録
  • cursorrulesにコマンド書式のプロンプトはMCPからコマンドの定義をまず検索するように記載
  • MCPサーバー経由で、コマンド名からコマンド定義を取得
  • コマンド定義に従って作業を実行

現在こんな感じでお試し中。

ざっくりとした仕組み

今回開発した仕組みはこんな感じ。

  • Model Context Protocol (MCP)を使って、CursorとSSEを通じて通信するサーバーを構築
  • コマンド管理データをNext.jsとSQLiteで作成・管理できるシステムの実装
  • 管理サーバーによるコマンドの一元管理と簡易な操作性の実現

MCPをシンプルに使いつつ、コマンドを管理するサーバーを立てた。

MCPを活用したSSE形式のサーバー構築

MCPはAIとのコンテキスト共有を効率化するためのプロトコルで、CursorはStdioTransportとSSEの2種類に対応してるみたい。

コマンド形式じゃなくてAPI形式でやり取りできる方が汎用性高くできそうだと思ったので、今回はSSEを採用。 た

ただ、cursorとclaude3.7でやるとうまくできず、ハマってしまった。

SSEのドキュメントも日本語・英語ともにあんまり見つけられなくていい感じの記事も少なかったので、最終的にはMCPのtypescript-sdkのコードを読みつつ対応した。

基本的な構造としてはこんな感じ。

  • SSEエンドポイントの設定(接続のための/sseとメッセージ送信の/messages)
  • クライアントからのリクエスト受信処理とコマンドのparse
  • parseした内容でコマンド検索
  • 検索したコマンド定義と任意の引数を結合して返却

コマンド形式でリクエストを投げると、こんな感じでMCPから定義を取得した上で処理を進めてくれる。

MCPの動作

これでCursorからのリクエストを受け取って、コマンド定義を返す仕組みができた。

コマンド管理システムの開発

次に、MCPサーバーで扱うデータを管理するためのサイトをNext.jsとSQLiteで構築した。

こっちはシンプルなCRUDだけのアプリで、コマンドの登録・編集・削除といった管理作業が簡単にできるようにするためのもの。

シンプルな構造なので、cursorとclaude3.7でできた(claude3.7になってデザイン力上がった気がする)

コマンド管理システム

使ってる技術周り

今回のプロジェクトで使用した主な技術は以下の通り。

  • Cursor
  • Claude3.7
  • Next.js
  • TypeScript
  • Express
  • SQLite
まとめ

コマンド定義でのやり取りはいままでもいい感じだと認識していたので、これについては現状特に変わりなし。

ただ、

  • コマンド形式で渡すとほぼ確実にコマンド定義を確認してくれるようになった
  • 毎回コンテキストに渡さなくて済むようになった
  • cursorrulesの内容がシンプルかつ少なくなった

という感じなので、良さそう。まだ開発用途ではがっつり使えてないので、コンテキスト渡しよりも精度が上がるか試していくところ。

いったんはコマンド定義だけなので、のちのちはコマンドを組み合わせたworkflowも登録できるようにして、MCP経由でより複雑な操作を、できるだけ安定した挙動で進められるか試してみたい。

ちなみに、この記事はこのMCPコマンド形式で作成したものを添削・修正した。記事作成の流れは以下。

  • 以下コマンドをコマンド管理ツールで追加
    • make_hearing -> 記事作成のために必要な情報を記入するテンプレートファイルを生成
    • make_article -> ヒアリングシートとあらかじめ定義した記事テンプレートガイドを元に記事を作成
  • make_hearingを呼び出してヒアリングシートを作成してもらう
  • ヒアリングシートに記入
  • make_articleを呼び出して記事を作成してもらう
  • 記事の内容を確認して修正

まだ記事の完成度が体感6割くらい?で低いけど、叩き台としては便利で、今後も使っていきたい。あとは、プロンプト周りを整備して添削を減らしていきたい。

参考資料
おわり

🐻

Profile picture