最近在折腾 MCP,想让 AI 直接读写本地文件、调数据库。按官方文档配好了 server,Claude 这边有时能正常调工具,有时就完全无视 tool 的存在,直接开始瞎编。试过换不同的 MCP server,情况也差不多。日志里看到 tool 是注册成功的,但模型就是不调用。有没有人遇到过类似情况?是 prompt 写的问题,还是模型对 MCP 的支持本身还不太稳定?求指点。
MCP 工具调用总是不稳定,是我的配置问题还是模型本身的锅?
全部回复
共 4 条我前段时间也踩过这坑,后来发现很多时候不是模型的问题,是 system prompt 里对工具的描述太模糊了。模型得清楚知道啥时候该用工具、啥时候不该用,光注册成功没用。你可以试试在 prompt 里明确写"需要读取文件时必须调用 xxx 工具",别让它自己猜。另外 Claude 有时候确实会偷懒,尤其是上下文一长就更明显,换个短点的对话窗口测测看。
我也踩过这个坑,后来发现大概率是工具描述写得太模糊。模型判断要不要调工具,主要看 description 和当前上下文匹不匹配,注册成功不代表它知道啥时候该用。建议你把每个 tool 的用途、触发场景写具体点,最好带个例子,我改完之后调用率明显上来了。另外系统提示里明确说一句“需要读写文件时必须用工具,不要凭记忆回答”也挺管用。
这个坑我也踩过,而且踩了不止一次。你日志里看到 tool 注册成功但模型不调用,大概率不是 server 的问题,而是模型在“决定要不要用工具”这一步就卡住了。MCP 本质上是把工具描述塞进上下文,模型得自己判断该不该调,这个判断过程对 prompt 的措辞、工具描述的清晰度特别敏感。我遇到过工具名太抽象、description 写得太笼统,模型就干脆当没看见,直接凭记忆瞎答。后来把每个 tool 的用途、参数、返回格式写得更具体,甚至在 system prompt 里明确说“需要读写文件时必须调用对应工具”,命中率明显上来了。另外上下文长度也有影响,工具一多、对话一长,模型注意力会被稀释,越靠后的工具越容易被忽略。Claude 对 MCP 的支持确实还在迭代,不同版本行为差异挺大的,可以试试固定一个已知稳定的模型版本对比一下。还有个偏方是把工具调用拆成两步,先让模型输出“我要用哪个工具”,再触发实际调用,稳定性会好一些。
我这边也踩过这个坑,后来发现多半是系统提示里没把工具的存在感写足。模型对工具的注意力很依赖上下文,你要是只在开头提一嘴,聊着聊着它就给忘了。可以试试在每轮对话里都轻量提醒一下有哪些工具可用,或者把工具描述写得更具体点,别太抽象。另外Claude对MCP的支持确实还在迭代,偶尔抽风也正常,换个版本或换个模型对比一下会更有数。