🚀 Consult LLM MCP
Claude Code を使用している際に、複雑な問題に対する深い分析が必要な場合、より強力なAIモデル(o3、Gemini 2.5 Pro、DeepSeek Reasoner)に相談できるMCPサーバーです。
このSQLクエリは大規模なデータセットでタイムアウトしています。最適化を手伝ってくれますか?Geminiに相談します。
⏺ あなたのクエリを調べ、データベースの最適化戦略についてGeminiに相談します。
⏺ consult-llm:consult_llm (MCP)(prompt: "この低速なSQLクエリを大規模データセットでより良いパフォーマンスを得るためにどのように最適化できますか?", files: ["queries/user -analytics.sql","schema/tables.sql"], model: "gemini-2.5-pro")
⎿ このクエリには重大なパフォーマンスのボトルネックがあります。結合列にインデックスがないこと、CTEにできる非効率なサブクエリ、不必要なDISTINCT操作があります。(user_id, created_at)に複合インデックスを追加し、相関サブクエリをウィンドウ関数で置き換え、冗長なGROUP BY句を排除してください。
… +287行 (ctrl+r で展開)
⏺ 素晴らしい洞察です!提案されたインデックスを追加し、サブクエリをCTEとウィンドウ関数を使ってリファクタリングし、GROUP BY操作を最適化します。
✨ 主な機能
- 関連ファイルをコンテキストとして、強力なAIモデル(o3、Gemini 2.5 Pro、DeepSeek Reasoner)にクエリを送信することができます。
- オプションでファイルコンテキストを指定して直接クエリを行うことができます。
- コードレビューと分析のためにgitの変更内容を含めることができます。
- コスト推定付きの包括的なログを記録します。
📦 インストール
Claude CodeにMCPサーバーを追加します。
claude mcp add consult-llm -- npx -y consult-llm-mcp
または、グローバルに利用可能にするには:
claude mcp add --scope user consult-llm -- npx -y consult-llm-mcp
必要に応じて、MCP構成で直接環境変数を指定することもできます。
claude mcp add \
-e OPENAI_API_KEY=your_openai_key \
-e GEMINI_API_KEY=your_gemini_key \
-e DEEPSEEK_API_KEY=your_deepseek_key \
consult-llm -- npx -y consult-llm-mcp
💻 使用例
基本的な使用法
問題を説明し、Claude Codeにより強力なLLMに相談させる
<ここに問題の長い説明を記載>
LLMに相談して支援を求めます。Geminiを使用します。
⏺ 問題がわかりました!問題は、フロントエンドが「isn't」のヒントを使おうとしているのに、サーバーが「isn't it」(完全なフレーズ)のヒントを生成していることです。これは、フロントエンドがテキストをセグメント化する方法と、サーバーがヒントを生成する方法が一致しないためです。
LLMにこのセグメント化の不一致問題について支援を求めます。
⏺ Write(hint-segmentation-issue.md)
⎿ hint-segmentation-issue.mdに53行を書き込みました
# Hint Segmentation Mismatch Issue
## Problem Description
フロントエンドがクリック可能な単語のためにテキストをセグメント化する方法と、バックエンドがヒントを生成する方法が一致していません。これにより、セグメントが正確に一致しない場合、ヒントのロック解除が失敗します。
## Example Case
**Original Text**: "Hello! Nice weather, isn't it?"
… +43行 (ctrl+r で展開)
⏺ consult-llm:consult_llm (MCP)(model: "gemini-2.5-pro", files: ["/project/hint -segmentation-issue.md","/project/web/src/components/HintsText.tsx","/project/web/src/utils/hints.ts","/project/server/src/routes/public/hints.ts","/project/server/src/llm/hints.ts"])
⎿ 問題の優れた分析です。根本原因が正しく特定されました。`HintsText.tsx` の `handleConfirmGenerateHints` 関数内の競合状態です。`await generateHints()` の後にコンポーネントの状態がバックグラウンドで更新されますが、関数は古い `activeSegment` 変数で実行を続け、より小さいテキストセグメント(例:「isn't」)のヒントを要求してしまい、新しく利用可能な完全なヒントフレーズ(例:「isn't it」)を取得できません。
… +607行 (ctrl+r で展開)
⏺ 完璧です!LLMが核心的な問題を特定しました。`handleConfirmGenerateHints` で非同期操作後に古い状態を使用している競合状態があります。解決策は、生成後にヒントキーを再ターゲットにして、正しい一致するヒントを見つけることです。
この解決策を実装しましょう。
⏺ Update Todos
⎿ ☐ handleConfirmGenerateHints でより賢いヒントキーのターゲット設定を実装して、ヒントのセグメント化の不一致を修正する
Neovimプラグインのtreesitter APIの破損をデバッグする
⏺ 修正しました!nodeとchildの両方にnilチェックを追加し、iter_matches呼び出しを更新して、新しいAPIを適切に処理するようにしました。
> まだ動作しません。
E5108: Error executing lua /Users/raine/code/testonly.nvim/lua/testonly.lua:92: attempt to call method 'child' (a nil value)
stack traceback:
/Users/raine/code/testonly.nvim/lua/testonly.lua:92: in function 'reset_all_exclusive'
/Users/raine/code/testonly.nvim/lua/testonly.lua:110: in function 'reset_all_exclusive'
[string ":lua"]:1: in main chunk
Geminiに相談します。
⏺ 現在のNeovimのtreesitter APIの変更を理解するために、より強力なAIに相談します。
⏺ consult-llm:consult_llm (MCP)(prompt: "treesitter APIの変更により破損したNeovimプラグインをデバッグしています。エラーは「attempt to call method 'child' (a nil value)」で、92行目で発生しています。コードはtreesitterのマッチから子ノードにアクセスしようとしていますが、新しいNeovimバージョンではAPIが変更されたようです。\n\n問題のあるコードは以下の通りです。\n```lua\nfor _, match, _ in parsed_query:iter_matches(root, bufnr, start_row, end_row) do\n for id, node in pairs(match) do\n local name = parsed_query.captures[id]\n if name == \"call\" and node then\n local child = node:child(0) -- ERROR HERE\n if child then\n local text = vim.treesitter.get_node_text(child, bufnr)\n -- ... rest of logic\n end\n end\n end\nend\n```\n\n現在のNeovimバージョンでtreesitterクエリのマッチを反復処理し、子ノードにアクセスする正しい方法は何ですか?どのようなAPIの変更に注意すべきですか?", files: ["/Users/raine/code/testonly.nvim/lua/testonly.lua"])
⎿ 問題
-------
… +93行 (ctrl+r で展開)
⏺ 完璧です!問題は、iter_matches() がマッチテーブルでnilノードを返す可能性があることです。推奨される iter_captures() アプローチに切り替えてこれを修正しましょう。
⏺ Update(lua/testonly.lua)
⎿ lua/testonly.lua を7行追加、10行削除して更新しました
85 local root = parser:parse()[1]:root()
86 local start_row, _, end_row, _ = root:range()
87
88 - for _, match, _ in parsed_query:iter_matches(root, bufnr, start_row, end_row) do
89 - for id, node in pairs(match) do
90 - local name = parsed_query.captures[id]
91 - if name == "call" and node then
92 - local child = node:child(0)
93 - if child then
94 - local text = vim.treesitter.get_node_text(child, bufnr)
88 + for id, node, _ in parsed_query:iter_captures(root, bufnr, start_row, end_row) do
89 + if parsed_query.captures[id] == "call" then
90 + local first_child = node:named_child(0)
91 + if first_child then
92 + local text = vim.treesitter.get_node_text(first_child, bufnr)
93
94 - if text == "it.only" or text == "describe.only" then
95 - toggle_test_exclusive(child)
96 - end
94 + if text == "it.only" or text == "describe.only" then
95 + toggle_test_exclusive(first_child)
96 end
97 end
98 end
⏺ 修正しました!主要な変更点は以下の通りです。
1. iter_matches() から iter_captures() に切り替えました。iter_captures() はnilノードを返すことがありません。
2. 意味のある構文ノード(句読点ではない)のみを取得するために、child(0) の代わりに named_child(0) を使用しました。
3. iter_captures() が直接ノードとキャプチャIDを提供するため、反復処理のロジックを簡素化しました。
現在のNeovimのtreesitter APIで、<leader>tr マッピングが正常に動作するはずです。
📚 ドキュメント
MCPツール: consult_llm
サーバーは、強力なAIモデルに複雑な質問をするための consult_llm という単一のツールを提供します。
パラメータ
- prompt (必須): コンサルタントLLMに対する質問または要求です。
- files (オプション): コンテキストとして含めるファイルパスの配列です。
- すべてのファイルは、ファイルパスとコードブロックとともにコンテキストとして追加されます。
- model (オプション): 使用するLLMモデルです。
- オプション:
o3 (デフォルト), gemini-2.5-pro, deepseek-reasoner
- git_diff (オプション): gitの差分出力をコンテキストとして含めます。
- files (必須): 差分に含める特定のファイルです。
- repo_path (オプション): gitリポジトリのパスです(デフォルトは現在のディレクトリ)。
- base_ref (オプション): 比較するgit参照です(デフォルトはHEAD)。
利用例
基本的なプロンプト:
{
"prompt": "Node.jsでasync/awaitとPromise.then()を使用する場合のパフォーマンスの影響は何ですか?"
}
ファイルコンテキスト付き:
{
"prompt": "この認証ミドルウェアをどのように最適化できますか?",
"files": ["src/auth.ts", "src/middleware.ts"],
"model": "o3"
}
git差分付き:
{
"prompt": "これらの認証の変更に対するセキュリティ上の問題をレビューしてください。",
"files": ["src/auth.ts"],
"git_diff": {
"files": ["src/auth.ts", "src/middleware.ts"],
"base_ref": "main"
},
"model": "gemini-2.5-pro"
}
サポートされるモデル
- o3: OpenAIの推論モデル(100万トークンあたり$2/$8)
- gemini-2.5-pro: GoogleのGemini 2.5 Pro(100万トークンあたり$1.25/$10)
- deepseek-reasoner: DeepSeekの推論モデル(100万トークンあたり$0.55/$2.19)
ロギング
すべてのプロンプトと応答は、以下の情報とともに ~/.consult-llm-mcp/logs/mcp.log に記録されます。
- ツール呼び出しパラメータ
- 完全なプロンプトと応答
- トークン使用量とコスト推定値
例
[2025-06-22T20:16:04.673Z] TOOL CALL: consult_llm
Arguments: {
"files": [
"refactor-analysis.md",
"src/main.ts",
"src/schema.ts",
"src/config.ts",
"src/llm.ts",
"src/llm-cost.ts"
],
"model": "deepseek-reasoner"
}
================================================================================
[2025-06-22T20:16:04.675Z] PROMPT (model: deepseek-reasoner):
## 関連ファイル
### ファイル: src/main.ts
...
できる限り具体的なコード構造の例を含めて、リファクタリングの具体的な提案を提供してください。
================================================================================
[2025-06-22T20:19:20.632Z] RESPONSE (model: deepseek-reasoner):
分析に基づいて、関心事の分離と保守性を向上させるための主要なリファクタリング提案は以下の通りです。
...
このリファクタリングにより、すべての既存の機能が維持されると同時に、保守性と関心事の分離が大幅に向上します。新しい構造により、新しいLLMプロバイダー、追加のコンテキストソース、または代替のプロンプト形式などの機能を追加することが容易になります。
Tokens: 3440 input, 5880 output | Cost: $0.014769 (input: $0.001892, output: $0.012877)
CLAUDE.mdの例
必ずしも必要ではありませんが、Claude Codeがいつおよびどのようにこのツールを使用するかを理解するのに役立つように、プロジェクトの CLAUDE.md ファイルに次のような内容を追加することができます。
## consult-llm-mcp
`consult_llm` MCPツールを使用して、複雑な問題に対してより強力なAIに助けを求めます。変更に対するフィードバックを求める際には、ファイルやgit_diffを含めてください。
Gemini 2.5 Proを使用します。
重要: 質問する際には、選択肢を提示しないでください。これにより回答が偏る可能性があります。
ただし、この指示がなくても、Claude CodeはこのMCPをいつ使用するかをかなりよく判断するようです。