2026年10月16日、17日にKaigi on Rails 2026が開催されました。 今回私は『AIエージェントのデバッグ能力を向上させよう — AI時代にRailsが輝く理由』というタイトルで登壇させていただきました。 本記事では発表の内容や感想をまとめたいと思います。
発表情報
- 公式ページ: https://kaigionrails.org/2026/talks/rira100000000/
- スライド:
- debug-mcp: https://github.com/rira100000000/debug-mcp
発表概要
AIに修正を頼むと「原因はおそらくこれです。修正しました。動作確認をお願いします」と返ってきて、確認すると直っていない。そんなループに覚えのある方は多いと思います。 このループの原因は、AIの能力不足ではなく、AIが実行時の状態を自分で確かめる手段を持っていないことにあります。DBに残った不整合データや、メモ化されたまま古くなった値は、コードのどこにも書かれていません。コードから立てられるのは仮説までで、確かめる役は人間に回ってきます。
そこで、Rubyのdebug gemのリモート接続をMCPサーバーとして包み、AIエージェントに渡すgem「debug-mcp」を作りました。ブレークポイントで止める、変数を見る、コードを評価する、進める。人間がデバッガでやることを、そのままAIの道具にしています。
デモでは「PATCHで直して200が返ったのに、GETはまだ500」というバグを扱いました。AIはソースから立てた仮説を断定せず、実行中のモデルに readonly_attributes を聞いて事実にし、発行されたSQLに email が含まれていないことを自分で確かめました。そのうえで、DBを直接更新してよいかを人間に尋ねて止まります。人間に返ってきたのは「動作確認」ではなく「判断」でした。
デモ映像はこちらです。
Kaigi on Rails2026 Demo - YouTube
この仕組みの裏で効いているのがRailsです。モデルからビューまでが1プロセスに収まるモノリス、モデル自身に構造を聞けるリフレクション、APMと同じ仕組みでイベントを拾える ActiveSupport::Notifications。人間のために積み上げられてきた観測のしやすさが、AI時代にそのまま土台として使えます。
最後に応用として、再現しないflakyテストを、失敗したその瞬間に止めて保全し、後からAIに調べさせる使い方を紹介しました。あわせて、デバッガをAIに開くことは任意のコード実行を許すことなので、開発環境に限って使う、という線引きにも触れています。
発表後にもらった質問
発表後、いくつか質問をいただきました。その場でうまく答えられなかったものもあるので、考えたことを書いておきます。
rails runner じゃだめ?debug-mcp の優位性は?
rails runner で足りる場面は、rails runner で十分だと思っています。実際、発表の準備中にMCPの接続が切れていたとき、AIはログと rails runner だけでバグを解決したことがありました。
runner が向いているのは、どのプロセスで聞いても同じ答えが返ってくるものです。スキーマ、バリデーションの定義、ルーティング、それに「どのレコードのどの属性を見ればいいか」がもう分かっているデータの照会がそうです。
debug-mcp が必要になるのは、失敗しているそのプロセスの中を見たいときです。
- どこを見ればいいか分からないとき。失敗したリクエストのその場所で止まれば、そこにいるオブジェクトから調べ始められます
- 保存されずにメモリにだけある値。デモの
@user.emailがそうで、別プロセスの runner からは見えません - そのリクエストが実際に発行したSQL。runner で同じ操作をやり直しても、それは別の実行のSQLです
- メモ化やキャッシュのように、起動し直すと消えてしまう状態
- 再現しないflakyテスト。失敗したその実行が唯一の証拠になります
runner は「どこを見るか分かった後」の道具で、debug-mcp は「どこを見るかを探す」ための道具だと考えています。
MCPはコンテキストを常に消費するが、スキルではだめか?
正直なところ、この質問にはその場でうまく答えられませんでした。
コンテキストの節約という意味では、スキルに分があるのはその通りだと思います。改めて考えてみると、debug-mcp の機能はスキルとCLIの組み合わせにも寄せられそうです。ただ、スキルにすると変わる部分がいくつか見えてきました。
- AIはBashからCLIを叩くことになり、Rubyのコードをシェルの引数に渡すときのエスケープでつまずきやすくなる
- ブレークポイントで止まっている間、HTTPリクエストの応答を待ち続けるプロセスの起動と後始末を、誰かが管理しなければならない
どちらも、AIエージェントが上手に使いこなせれば問題にはなりません。でも私は、その「上手に使いこなせれば」を前提にしたくありません。AIエージェントの道具を作るときは、AIエージェントにとっての使いやすさを追求したいと思っています。あえてMCPを使いたい理由は、AIエージェントにとってどちらが扱いやすいか、という軸にあります。
とはいえ、トークンがかさむことのコストも重要です。この点はクライアント側も変わってきています。Claude Code では今年に入ってMCPのツール検索(tool search)が入り、ツールの定義を必要になってから読み込むようになりました。最初は定義の量がコンテキストの一定割合を超えたときだけの動きでしたが、今は既定で、最初に読み込まれるのはツール名とサーバーの説明文(instructions)だけです。ENABLE_TOOL_SEARCH という環境変数で切り替えられます。
そうなると、常に載るのはサーバーの説明文が中心になります。調べてみると、debug-mcp の説明文は長すぎて、Claude Code の上限で途中から切れていました。コンテキストを削る改善は debug-mcp 側でも必要なので、考えていきたいと思います。
Kaigi effect
カンファレンスの後に手を動かしたことも書いておきます。
- debug-mcp が依存している mcp gem のバージョンが古い、というご指摘をいただいたので、1.x に上げて debug-mcp 0.4.0 としてリリースしました
- 以前作ったセキュリティ診断のgem「omamori」をアップデートし、0.2.0 を公開しました。高速な判定モデルで35項目のリスクを一つずつ判定し、引っかかった項目だけをLLMが詳しく報告する仕組みにしています
今後
debug-mcp は、debug gem と話す部分を DAP(Debug Adapter Protocol)に移行する予定です。今のリモートコンソールは人間向けの対話のための仕組みで、リクエストと応答の対応が取れないため、AIが扱うとセッションが壊れることがあります。 全ての操作が応答つきのリクエストになる DAP なら、AIにとってもっと扱いやすくなるはずです。
登壇してみて
本番はとても緊張しましたが、大きな問題なく、時間もちょうど15分で話し終えることができました。 発表後には、「AI時代こそ可観測性」「AIが人間を検証装置にしている」というところに共感の声をいただきました。debug-mcp を使ってみたいと言ってくださった方もいて、作ったものに直接反応をもらえるのは本当にうれしかったです。
おわりに
Kaigi on Rails 2026 の運営・スタッフの皆さん、素晴らしい場をありがとうございました。当日に翻訳の打ち合わせをしてくださった方、聞きに来てくださった皆さん、声をかけてくださった皆さんにも感謝します。

