一个允许Claude Code在遇到复杂问题时咨询更强大的AI模型(如o3、Gemini 2.5 Pro、DeepSeek Reasoner、GPT-5.1 Codex)的MCP服务器。当Sonnet无法提供解决方案时,可以调用这些高级模型来解决问题。
此SQL查询在大数据集上超时了。你能帮助优化它吗?询问Gemini
⏺ 我会检查你的查询,并咨询Gemini以获取数据库优化策略。
McCartney 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展开)
McCartney 大有裨益!我将添加建议的索引,重构子查询以使用带有窗口函数的CTE,并优化GROUP BY操作。
gemini CLI利用免费配额codex CLI进行OpenAI模型将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 consult-llm \
-e OPENAI_API_KEY=your_openai_key \
-e GEMINI_API_KEY=your_gemini_key \
-e DEEPSEEK_API_KEY=your_deepseek_key \
-e GEMINI_MODE=cli \
-- npx -y consult-llm-mcp
一些实际案例。点击展开。
<details> <summary>解释问题,并告诉CC咨询更智能的LLM</summary> <此处对问题的长篇解释>
咨询LLM以获取帮助,使用gemini
McCartney 我看到问题了!问题是前端试图使用“isn't”的提示,但服务器生成的是“isn't it”(完整的短语)。这是前端分割文本方式与服务器生成提示方式之间的不匹配。
McCartney 让我咨询LLM以获取关于这种分割不匹配问题的帮助。
McCartney 写(hint-segmentation-issue.md)
⎿ 写入53行至hint-segmentation-issue.md
# 提示分割不匹配问题
## 问题描述
前端分割文本供点击单词的方式与后端生成提示的方式之间存在不匹配,这导致当段落不完全匹配时提示解锁失败。
## 示例案例
**原始文本**:"Hello! Nice weather, isn't it?"
… +43 行(按Ctrl+R展开)
McCartney 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展开)
McCartney 完美!LLM确定了核心问题——在`handleConfirmGenerateHints`中存在竞态条件,在异步操作之后使用过时的状态。解决方案是在生成后重新定位提示键以找到正确的匹配提示。
McCartney 让我实现这个解决方案:
McCartney 更新待办事项
⎿ ☐ 通过在`handleConfirmGenerateHints`中实现更智能的提示键定位来修复提示分割不匹配问题
</details>
<details>
<summary>使用Web模式将提示复制到剪贴板以供基于浏览器的LLM使用</summary>
> 我需要帮助实现一个-b/--background标志在我的Rust CLI中。使用具有Web模式的consult LLM
McCartney 我将使用Web模式将格式化的提示复制到剪贴板,这样你可以将其粘贴到任何基于浏览器的LLM服务中。
McCartney consult-llm:consult_llm (MCP)(prompt: "实现-b/--background标志的最佳方法是什么,该标志用于创建tmux窗口而不切换到它?\n\n当前实现自动切换到新创建的窗口,通过在`setup_environment()`函数中的`tmux::select_window()`。我需要根据从CLI传递的标志使这种行为有条件。\n\n考虑:\n1. 背景标志应该贯穿调用链的哪个位置?\n2. 是否应该修改现有的SetupOptions结构或添加参数?\n3. 给定代码库结构,哪种方法最易于维护?\n4. 是否有任何边缘情况需要考虑(例如,是否也应该使select_pane有条件)?", files: ["src/cli.rs","src/workflow.rs","src/tmux.rs"], web_mode: true)
⎿ ✓ 提示已复制到剪贴板!
请将其粘贴到您的基于浏览器的LLM服务中,并在此处分享响应,然后我将继续实施。
注意:已包含文件路径:
- src/cli.rs
- src/workflow.rs
- src/tmux.rs
> [用户粘贴来自外部LLM的响应]
McCartney 感谢您!根据推荐,我现在将实现解决方案...
这在以下情况下很有用:
McCartney 已修复!为node和child添加了空值检查,并更新了iter_matches调用来正确处理新的API。
> 仍然不起作用:
E5108: 执行Lua错误 /Users/raine/code/testonly.nvim/lua/testonly.lua:92: 尝试调用方法'child'(空值)
堆栈跟踪:
/Users/raine/code/testonly.nvim/lua/testonly.lua:92: 在函数'reset_all_exclusive'中
/Users/raine/code/testonly.nvim/lua/testonly.lua:110: 在函数'reset_all_exclusive'中
[字符串":lua"]:1: 在主块中
询问gemini
McCartney 让我咨询更强大的AI以了解当前Neovim treesitter API的变化:
McCartney consult-llm:consult_llm (MCP)(prompt: "我在调试一个由于treesitter API变化而损坏的Neovim插件。错误是第92行的“尝试调用方法'child'(空值)”。代码试图访问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) -- 错误在这里\n if child then\n local text = vim.treesitter.get_node_text(child, bufnr)\n -- ... 逻辑的其余部分\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展开)
McCartney 完美!问题是iter_matches()可能返回match表中的空值节点。让我通过切换到推荐的iter_captures()方法来解决这个问题:
McCartney 更新(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
2 + 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
McCartney 已修复!关键更改:
1. 从iter_matches()切换到iter_captures(),后者永远不会返回空值节点
2. 使用named_child(0)代替child(0),以获取有意义的语法节点(而非标点符号)
3. 由于iter_captures()直接给出节点和捕获ID,简化了迭代逻辑
您的<leader>tr映射现在应能正常工作,符合当前Neovim treesitter API。
</details>
当您希望Claude Code准备提示,但自己通过LLM Web UI发送(ChatGPT、Claude.ai、Gemini等),请告知其“使用具有Web模式的consult LLM”。Claude将向consult_llm传递web_mode: true,MCP将组装完整的提示(系统提示+文件+git diff),而不是通过API,而是将文本复制到剪贴板,您可以将其粘贴到任何地方。
web_mode: true调用工具。参见上面的“使用Web模式...”示例,以获取此流程的具体记录。
当您希望利用Google的免费配额或将提示保留在API之外时,启用CLI模式,让consult-llm本地启动gemini二进制文件,而不是通过API发送提示。
gemini命令在您的$PATH中。gemini login进行身份验证(以及CLI所需的任何其他设置)。GEMINI_MODE=cli:
claude mcp add consult-llm \
-e GEMINI_MODE=cli \
-- npx -y consult-llm-mcp
consult_llm,使用Gemini模型,组装提示,并自动转到CLI。当您希望使用OpenAI模型通过CLI本地运行,而不是通过API调用时,使用OpenAI的Codex CLI。
codex命令在您的$PATH中。codex login进行身份验证(以及CLI所需的任何其他设置)。OPENAI_MODE=cli:
claude mcp add consult-llm \
-e OPENAI_MODE=cli \
-- npx -y consult-llm-mcp
gpt-5.1-codex)。它将调用consult_llm,使用指定的模型,组装提示,并自动转到Codex CLI。在使用Codex CLI模式时,可以通过CODEX_REASONING_EFFORT环境变量控制推理努力程度:
claude mcp add consult-llm \
-e OPENAI_MODE=cli \
-e CODEX_REASONING_EFFORT=xhigh \
-- npx -y consult-llm-mcp
可用的推理努力程度:none、minimal、low、medium、high、xhigh
更高的推理努力程度可能会提供更全面的分析,但完成时间更长。这作为-c model_reasoning_effort="<level>"传递给Codex CLI。
OPENAI_API_KEY - 您的OpenAI API密钥(对于API模式下的OpenAI模型是必需的)GEMINI_API_KEY - 您的Google AI API密钥(对于API模式下的Gemini模型是必需的)DEEPSEEK_API_KEY - 您的DeepSeek API密钥(对于DeepSeek模型是必需的)CONSULT_LLM_DEFAULT_MODEL - 覆盖默认模型(可选)
o3(默认)、gemini-2.5-pro、deepseek-reasoner、gpt-5.1-codex-max、gpt-5.1-codex、gpt-5.1-codex-mini、gpt-5.1GEMINI_MODE - 选择Gemini模型的API或CLI模式(可选)
api(默认)、cligemini CLI工具OPENAI_MODE - 选择OpenAI模型的API或CLI模式(可选)
api(默认)、clicodex CLI工具CODEX_REASONING_EFFORT - 配置Codex CLI的推理努力程度(可选)
您可以通过在~/.consult-llm-mcp/中创建SYSTEM_PROMPT.md文件来自定义咨询LLM时使用的系统提示:
consult-llm-mcp init-prompt
这将创建一个包含默认系统提示的占位符文件,您可以编辑它来自定义咨询LLM的行为。自定义提示会在每次请求时读取,因此更改会立即生效,无需重启服务器。
要恢复默认提示,只需删除SYSTEM_PROMPT.md文件即可。
服务器提供了一个名为consult_llm的单一工具,用于向强大的AI模型提出复杂问题。
prompt(必需):您对咨询LLM的问题或请求
files(可选):作为上下文包含的文件路径数组
model(可选):要使用的LLM模型
o3(默认)、gemini-2.5-pro、deepseek-reasoner、gpt-5.1-codex、gpt-5.1-codex-mini