🚀 咨询大语言模型MCP
这是一个MCP服务器,当你需要对复杂问题进行更深入的分析时,它可以让Claude Code咨询更强大的AI模型(o3、Gemini 2.5 Pro、DeepSeek Reasoner)。
这个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更改内容,用于代码审查和分析。
- 提供全面的日志记录,并进行成本估算。
📦 安装指南
将MCP服务器添加到Claude Code:
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中使用该工具的一些实际示例:
解释问题并让Claude Code咨询更强大的大语言模型
<这里是对问题的详细解释>
咨询大语言模型以获取帮助,使用Gemini
⏺ 我明白问题所在了!问题在于前端试图使用“isn't”的提示,但服务器生成的是“isn't it”(完整短语)的提示。这是前端文本分段方式与服务器生成提示方式之间的不匹配。
让我咨询大语言模型以解决这个分段不匹配的问题。
⏺ Write(hint-segmentation-issue.md)
⎿ 已将53行内容写入hint-segmentation-issue.md
# 提示分段不匹配问题
## 问题描述
前端对可点击单词进行文本分段的方式与后端生成提示的方式存在不匹配。当分段不完全匹配时,会导致提示解锁失败。
## 示例情况
**原始文本**:"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展开)
⏺ 完美!大语言模型识别出了核心问题——在`handleConfirmGenerateHints`中存在竞态条件,即函数在异步操作后使用了陈旧的状态。解决方案是在生成提示后重新定位提示键,以找到正确匹配的提示。
让我来实现这个解决方案:
⏺ Update Todos
⎿ ☐ 通过在`handleConfirmGenerateHints`中实现更智能的提示键定位来修复提示分段不匹配问题
调试Neovim插件treesitter API破损问题
⏺ 已修复!为节点和子节点添加了空值检查,并更新了`iter_matches`调用,以正确处理较新的API。
> 仍然无法正常工作:
E5108: Error executing lua /Users/raine/code/testonly.nvim/lua/testonly.lua:92: attempt to call method 'child' (a nil value)
堆栈跟踪信息:
/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
⏺ 让我咨询更强大的AI,以了解当前Neovim treesitter API的更改:
⏺ consult-llm:consult_llm (MCP)(prompt: "我正在调试一个因treesitter API更改而损坏的Neovim插件。错误信息是“attempt to call method 'child' (a nil value)”,位于第92行。代码试图从treesitter匹配中访问子节点,但在较新的Neovim版本中,API似乎发生了变化。
以下是有问题的代码:
```lua
for _, match, _ in parsed_query:iter_matches(root, bufnr, start_row, end_row) do
for id, node in pairs(match) do
local name = parsed_query.captures[id]
if name == "call" and node then
local child = node:child(0) -- 此处出错
if child then
local text = vim.treesitter.get_node_text(child, bufnr)
-- ... 其余逻辑
end
end
end
end
在当前的Neovim版本中,迭代treesitter查询匹配并访问子节点的正确方法是什么?我应该注意哪些API更改?", files: ["/Users/raine/code/testonly.nvim/lua/testonly.lua"])
⎿ 问题
-------
… +93行 (按ctrl+r展开)
⏺ 完美!问题在于iter_matches()
可能会在匹配表中返回空节点。让我通过切换到推荐的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
⏺ 已修复!关键更改如下:
- 从
iter_matches()
切换到iter_captures()
,后者不会返回空节点。
- 使用
named_child(0)
代替child(0)
,以仅获取有意义的语法节点(非标点符号)。
- 简化了迭代逻辑,因为
iter_captures()
直接提供了节点和捕获ID。
你的tr映射现在应该可以与当前的Neovim treesitter API正常工作。
</details>
### 高级用法
#### MCP工具:consult_llm
该服务器提供了一个名为`consult_llm`的工具,用于向强大的AI模型询问复杂问题。
##### 参数
- **prompt**(必需):你向咨询大语言模型提出的问题或请求。
- **files**(可选):作为上下文包含的文件路径数组。
- 所有文件都将作为上下文添加,包含文件路径和代码块。
- **model**(可选):要使用的大语言模型。
- 选项:`o3`(默认)、`gemini-2.5-pro`、`deepseek-reasoner`。
- **git_diff**(可选):将git差异输出作为上下文包含。
- **files**(必需):差异中要包含的特定文件。
- **repo_path**(可选):git仓库的路径(默认为当前目录)。
- **base_ref**(可选):用于比较的git引用(默认为HEAD)。
##### 示例用法
**基本提示:**
```json
{
"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的推理模型(每百万令牌2美元/8美元)。
- gemini-2.5-pro:谷歌的Gemini 2.5 Pro(每百万令牌1.25美元/10美元)。
- deepseek-reasoner:DeepSeek的推理模型(每百万令牌0.55美元/2.19美元)。
日志记录
所有提示和响应都会记录到~/.consult-llm-mcp/logs/mcp.log
中,包含以下信息:
- 工具调用参数。
- 完整的提示和响应。
- 令牌使用情况和成本估算。
示例
[2025-06-22T20:16:04.673Z] 工具调用: consult_llm
参数: {
"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] 提示 (模型: deepseek-reasoner):
## 相关文件
### 文件: src/main.ts
...
请根据需要提供具体的重构建议和示例代码结构。
================================================================================
[2025-06-22T20:19:20.632Z] 响应 (模型: deepseek-reasoner):
根据分析,以下是为提高关注点分离和可维护性而提出的关键重构建议:
...
这次重构在保留所有现有功能的同时,显著提高了可维护性和关注点分离。新结构使添加新功能(如新的大语言模型提供商、额外的上下文源或替代提示格式)变得更加容易。
令牌: 输入3440,输出5880 | 成本: 0.014769美元 (输入: 0.001892美元,输出: 0.012877美元)
CLAUDE.md示例
虽然不是严格必需的,但为了帮助Claude Code理解何时以及如何使用此工具,你可以选择在项目的CLAUDE.md
文件中添加以下内容:
## consult-llm-mcp
使用`consult_llm` MCP工具向更强大的AI寻求帮助,以解决复杂问题。在请求对更改进行反馈时,可包含文件或git差异。
使用Gemini 2.5 Pro。
重要提示:询问时不要提供选项,这会影响答案的客观性。
不过,即使没有此说明,Claude Code似乎也能很好地知道何时使用这个MCP工具。