最近在折腾MCP(Model Context Protocol),想把公司的知识库通过MCP Server暴露给Claude用。我用的FastAPI写了个简单的server,里面调用Qdrant的Python客户端做向量检索。本地测试没问题,但一通过MCP的stdio方式连上客户端,就报“Tool execution failed: Transport closed”。查了半天日志,发现是server端在返回结果时,把numpy的ndarray直接塞进了response里,MCP的JSON-RPC序列化直接炸了。我懵的是,按官方文档说返回类型得是JSON可序列化的,但也没说清楚向量查询结果该怎么包装。是我理解错了MCP的tool输出格式,还是Qdrant返回的数据结构需要额外处理?求大佬指个路,最好能说下你们生产环境是怎么处理的。
楼主
2026-08-12
MCP服务器接入向量数据库报错,不知道是配置问题还是协议理解错了?
请 登录 后发表回复
全部回复
共 85 条
2楼
2026-09-19
MCP返回前得把ndarray转成list,我踩过同样的坑,加个.tolist()立马就好了。
3楼
4天前
刚入门,这个对我帮助很大。
4楼
3天前
这个坑我踩过,MCP的JSON-RPC确实对返回类型卡得很死,ndarray、datetime这些都得手动转。向量检索结果一般就返回id、score和payload就够了,向量本身除非你要做二次计算否则没必要传回去。建议在工具函数里统一加一层序列化处理,把numpy类型转成list再返回,省得每次都在业务代码里改。
5楼
1天前
学到了,感谢分享!
6楼
20小时前
这个坑我也踩过,MCP的JSON-RPC序列化确实对类型挺敏感的,ndarray里还可能有NaN或者Infinity,就算转成list也可能挂。我一般是在tool返回前统一用个serialize函数把numpy类型全转成原生Python类型,float32转float、ndarray转tolist,顺手再处理下NaN。其实官方文档那句“JSON可序列化”挺模糊的,向量这种大数组到底该不该在tool结果里全量返回也值得琢磨,数据量大的话可能得分页或者只返回id加score。