现场是这样的。客户端显示服务已连接,但工具列表是空的,对话里也无法调用任何能力。
中间走过弯路,把「工具描述缺少必填字段被过滤」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。服务端没有实现工具注册方法;注册时抛异常被静默吞掉;客户端缓存了旧的能力列表。
动手时先用命令行客户端列出工具
python -c "print('npx @modelcontextprotocol/inspector')"
接着检查服务端注册逻辑是否有异常捕获
python -c "print('check register_tool try/except')"
补齐工具名与描述字段
python -c "print({'name':'search','description':'搜索文档','inputSchema':{}})"
剩下的就是重启客户端刷新能力列表
python -c "print('restart client')")
那几天正好在做别的变更,先把时间线对齐才敢动手。
怎么算真的好了,看的是同一批现象。工具列表里能看见注册的工具,对话中可以正常调用并返回结果。
容易忽略的是,注册阶段的异常如果被捕获后没有打印,表现就是连上了却没有工具,调试时先把异常抛出来再考虑容错。这类问题最好一次改到位,反复小改反而容易把原因搅混。