先把当时的情况摆出来。自己写的 MCP server 调 client 的 sampling/createMessage,客户端返回 JSON-RPC 错误码 -32601 Method not found,Claude Desktop 1.0 和自研 IDE 客户端表现一样,tools 调用却是通的,协议版本是 2024-11-05。
真正麻烦的地方在于,几个原因的现象几乎一样。客户端只实现了 tools 和 resources,没有声明 sampling 能力。少数情况下是initialize 时 capabilities 没带 sampling,server 仍然发起请求。
少数情况下是请求 id 用了字符串,客户端只接受数字 id。不容易想到的是,server 与 client 的协议版本不一致,方法名对不上。
先看 initialize 返回的 capabilities
python -c "import json;print(json.load(open('mcp_init.json'))['capabilities'])"
然后在 server 发起请求前检查客户端能力位
python -c "caps={'tools':{}};print('sampling' in caps)"
接着把请求 id 改成整数并重发一次
python -c "import json;print(json.dumps({'jsonrpc':'2.0','id':1,'method':'sampling/createMessage','params':{}}))"
客户端不支持时走本地模板兜底
python server.py --fallback-template prompts/summary.j2
隔了一天再看,现象没变,说明不是偶发。
恢复的判定其实很直接。server 在发起 sampling 前能正确判断客户端能力,不支持时走兜底模板,日志里不再出现 -32601,摘要结果仍然完整。
这里还有个坑。sampling 是可选能力,不是所有客户端都实现;server 端必须先读 capabilities 再决定调用,直接发请求只会拿到 Method not found。这类问题最好一次改到位,反复小改反而容易把原因搅混。
