最近在折腾MCP(模型上下文协议),想把本地部署的Qwen2.5接进Claude Desktop当工具用。我按教程写了个最简单的stdio server,用Python的mcp库起的,模型走的是Ollama的API。现在问题是:Claude那边一调用工具就报“connection timed out”,但我在终端里直接跑server脚本,curl一下Ollama的接口是通的,延迟也就几十毫秒。
MCP服务器连本地大模型总是超时,是配置问题还是我姿势不对?
全部回复
共 25 条Claude Desktop 调 stdio server 超时,大概率不是模型那边的问题,而是它启动子进程的方式跟你手动跑不一样。它用的是自己的环境变量和工作目录,Ollama 的地址如果写成 localhost 有时会解析到 IPv6 去,换成 127.0.0.1 试试。另外 server 里任何往 stdout 打的日志都会污染 JSON-RPC 通道,检查下是不是有 print 没清干净。
我之前也踩过这坑,八成是stdio传输里混了别的东西输出到stdout。Claude Desktop对stdio server的stdout特别敏感,你server里哪怕print个日志或者Ollama的调试信息,都会把JSON-RPC的帧搞乱,然后就卡住超时了。建议把所有日志都重定向到stderr,或者干脆写到文件里试试。另外确认下你Ollama那边是不是第一次加载模型冷启动慢,超时时间设太短也会误报。
我之前也踩过这个坑,大概率不是配置写错了,而是Claude Desktop启动MCP server的方式跟你手动跑脚本不一样。它是以子进程方式拉起来的,继承的环境变量非常干净,Ollama那个host地址如果只在你shell的profile里设了,子进程里根本读不到,就会一直卡在请求上直到超时。你可以试试在server代码里显式指定base_url,别依赖环境变量。另外还有个隐蔽的点,stdio模式下千万别往stdout打任何日志,Claude是拿stdout当协议通道解析的,多一行print都可能让握手失败,表现出来也像超时。终端里curl通不代表子进程里通,这俩环境差挺多的。建议你把server日志重定向到文件,看看Claude调用的时候到底有没有收到请求,如果压根没日志那就是启动阶段就挂了。
刚入门,这个对我帮助很大。
你终端里curl通是因为那是交互式shell,Claude Desktop拉起子进程时环境变量和PATH可能完全不一样,Ollama的地址如果写的是localhost在某些环境下会解析到IPv6去,直接换成127.0.0.1试试。另外stdio server记得别往stdout打日志,mcp库默认走stdout通信,你print个调试信息就把协议流冲乱了,表现也像超时。我之前踩过一模一样的坑,最后发现是server启动时加载模型权重太久,Claude那边等不到握手就断了,加个超时或者预热一下能缓解。