最近在折腾MCP(Model Context Protocol),想给本地跑的Qwen2.5-7B接上文件系统和数据库工具。用的Python SDK写了两个简单的server,在客户端(Claude Desktop)里调用时,工具列表能正常加载,但一执行实际工具调用就经常报-32001超时错误,偶尔等很久又能成功一次。本地模型用的Ollama跑的,显存没爆,模型响应本身挺快。我怀疑是不是MCP的stdio传输方式跟本地模型的同步调用有冲突?还是说需要给server加异步处理?另外看到有朋友推荐用SSE方式走HTTP,但不太清楚具体怎么配置。有没有踩过类似坑的朋友指点一下?
MCP服务器连本地大模型总超时,是配置问题还是架构选错了?
全部回复
共 45 条我之前也遇到过一模一样的-32001,排查了半天发现是MCP默认的stdio模式在等待工具返回时把主进程给阻塞了,特别是数据库查询这种耗时操作特别容易触发超时。后来我把server改成了异步(用asyncio包装了一下)并且把Ollama的请求也改成非阻塞,情况好了很多,但偶尔还是会抽风。SSE确实值得试,本质上是把传输层换成了HTTP长连接,能绕开stdio的进程间通信瓶颈,不过配置起来要改client端的transport参数,我记得Claude Desktop对SSE的支持还不是很完善。你如果坚持用stdio,可以试试把Ollama的keep_alive调长一点,或者减少工具返回的数据量,有时候是序列化太慢导致的。
stdio下同步阻塞确实容易卡超时,试试把工具调用扔进asyncio里跑。
我之前也遇到过类似的,-32001大概率不是模型慢,而是stdio那边卡住了。Claude Desktop对stdio server的输出很敏感,如果你server里print了任何调试信息到stdout,协议就乱了,工具调用就会一直等超时。建议先检查server有没有多余输出,日志全走stderr。另外同步阻塞调用确实容易出问题,改成async加超时控制会稳很多。SSE方式其实就是把server换成HTTP服务,配置上要指定url而不是command,适合调试但多一层网络开销。
stdio确实容易卡超时,换SSE走HTTP会稳很多,Ollama那边记得设长一点keep_alive。
这个 -32001 我也踩过,最后发现压根不是 MCP 本身的问题,是 Ollama 那边并发被卡住了。你客户端调工具的时候,Claude Desktop 其实会同时维持模型推理和 stdio 子进程通信两条线,Ollama 默认对同一模型的并发请求处理得很保守,一个请求没吐完,第二个就在排队,表现出来就是工具调用卡住然后超时。你可以先试试在 Ollama 启动时加 OLLAMA_NUM_PARALLEL 调大一点,或者干脆确认下是不是模型加载时被换出显存导致首 token 特别慢。stdio 传输本身跟同步调用没冲突,它就是个管道,真正的问题在服务端工具函数如果是阻塞式的,会把你整个 event loop 堵死,Python SDK 那边建议用 async def 包一层,耗时的 IO 丢到线程池里跑。SSE 那条路确实能缓解,但配置起来要自己起 HTTP 服务再挂到客户端配置里,调试成本更高,建议先把 stdio 这条链路捋顺。我现在的做法是给每个工具加个超时日志,打时间戳看看到底卡在哪一步,比盲猜强多了。