最近在折腾MCP(Model Context Protocol),想把本地部署的Llama 3服务通过MCP暴露给外部工具调用。按照官方文档配置了transport和endpoint,但每次启动服务都报“Connection refused”,日志里显示模型端根本没收到请求。我检查了端口、防火墙,甚至换了不同的模型后端(Ollama和vLLM都试过),还是不行。是不是MCP和模型之间的协议栈有坑?还是我配置里漏了某个关键参数?求大佬指点,卡了两天了,心态快崩了。
部署MCP服务连不上大模型,有人遇到过这种报错吗?
全部回复
共 150 条我之前也栽在这上面过,折腾半天发现是MCP服务监听的是localhost,但模型端绑的是127.0.0.1的IPv6,俩地址对不上就白搞。你试试把MCP的endpoint直接设成模型的/metrics或者/v1/chat/completions这种具体路径,别只写根地址,另外Ollama的话记得开OLLAMA_HOST=0.0.0.0。还有个坑是MCP默认走streaming响应,但vLLM的某些版本要显式开--enable-streaming,不然握手成功但数据传不回来。你先用curl手动打一下模型接口确认通不通,再排查MCP这层,大概率是路径或者header里authorization没带对。
遇到过类似的坑,最后发现是MCP配置里host写成了localhost,但模型服务绑定的却是0.0.0.0,导致IPv6解析直接连了::1。你可以先确认下两边监听地址是不是同一个,再用curl试下那个endpoint能不能通。另外Ollama和vLLM的默认端口不一样,如果你没显式指定MCP里的model endpoint端口,它可能还在拿默认值去连。
我之前折腾MCP的时候也卡在过Connection refused这上面,后来发现根本不是协议栈的问题,而是我把MCP server的监听地址配成了127.0.0.1,但外部工具实际是通过容器IP或者另一个网段去访问的,这玩意儿不报错才怪。你试试把host改成0.0.0.0,然后确认一下MCP的transport层是不是真的把请求转发到了Llama的端口上,有时候日志里没收到请求不代表没连上,可能是请求被吞了或者超时了。另外Ollama和vLLM虽然都支持OpenAI兼容接口,但MCP这边对endpoint路径的要求很死,比如vLLM的/v1/completions和/v1/chat/completions就差一个单词,配错了也会静默失败,你可以抓包看看实际发出的HTTP请求长啥样。还有个思路是绕开MCP自带的后端适配,直接用Python写个轻量代理,把MCP的tool call转成裸HTTP请求发给模型,这样排查起来更直观——我最后就是这么干的,省了两天时间。你检查下MCP的配置文件里有没有个叫context_timeout的参数,默认值特别短,Llama加载模型稍微慢点就触发超时,表现也是Connection refused,这个坑特别隐蔽。如果实在不行,把MCP server的日志级别调到DEBUG,它会把每次转发的目标地址和端口都打出来,对比一下实际监听的就清楚了。
我之前也卡在这过,后来发现是MCP SDK默认走的是stdio,你配置transport的时候如果写的是sse或者http,得确认服务端和客户端两边的协议版本对齐了,不然它根本不会往你设的endpoint发请求。另外Ollama和vLLM的接口路径不一样,比如Ollama是/api/generate,vLLM是/v1/completions,你MCP里配的model endpoint得跟后端实际暴露的路径完全一致才行。建议先单独curl一下那个地址看能不能通,排除MCP本身的问题。
检查下MCP服务监听地址是不是绑了127.0.0.1,改成0.0.0.0试试,我之前就栽在这上面。
我上次也这样,后来发现是MCP的endpoint配成了127.0.0.1,模型绑的是0.0.0.0,你检查下这个。
大概率是transport层用的HTTP/SSE,但vLLM只开了OpenAI兼容接口,没走MCP那套握手,试试直接curl模型端口看通不通。
我之前折腾MCP也卡在过这,后来发现是transport配成了HTTP但模型服务只开了SDK的gRPC端口,两边对不上。你试试直接用curl模拟一下MCP的initialize请求,看模型端到底有没有监听,或者把日志级别调到DEBUG看下握手那一步。另外Ollama和vLLM的endpoint路径不太一样,vLLM还得确认下有没有开额外的API服务,别光看默认端口通不通。
八成是MCP的client和server握手时用了sse,但你的endpoint写成了streamable http,这俩在最新spec里不兼容。
八成是MCP的server地址配成了localhost,但模型跑在容器或者别的网段,试试改成实际IP。
我之前也卡这,后来发现是health check路径没对上,vLLM和Ollama的endpoint不一样,直接改下就行。
大概率是MCP的endpoint配成了localhost,而模型绑的是0.0.0.0,试试把host改成127.0.0.1或者直接换成本机IP。
我前两天刚趟过这个坑,你试试看MCP服务配置里的host是不是绑了127.0.0.1,如果外部工具走的是容器或者远程地址,得改成0.0.0.0才行。另外Ollama默认只监听本地端口,vLLM那边记得要开--api-key或者关掉鉴权,不然握手阶段就直接被拒了。我最后是把MCP的transport从stdio换成streamable HTTP才通的,你可以对照下日志里有没有CORS相关的报错。
可以试试把MCP的endpoint从localhost换成127.0.0.1,之前我这么搞好的,可能是IPv6解析的锅。
遇到过类似的坑,而且我怀疑问题不一定在MCP本身,反而更可能出在模型服务的监听地址上。你试Ollama和vLLM时,确认过它们绑定的host是127.0.0.1还是0.0.0.0吗?如果模型端只监听localhost,而MCP服务尝试通过容器IP或外部IP去连,那必然connection refused,日志里模型端当然收不到任何请求。另外,有些模型服务会有自己的鉴权头或者API路径前缀,比如vLLM默认是/v1,而MCP配置里如果写成了根路径,或者忘了加Authorization头,也会出现这种“看起来没连上”的假象。建议你先用curl直接打一下模型服务的健康检查接口,排除MCP干扰,确认裸调用没问题,再回头查MCP的transport配置。还有一个容易忽略的点是MCP用的SDK版本,有些早期版本对streaming响应支持有问题,会主动断开连接。如果curl正常,那大概率就是MCP侧把endpoint或端口拼错了,仔细对一下官方示例里的JSON结构,尤其是serverInfo和capabilities那几层。卡两天确实烦躁,但这类问题多半是配置细节,不是协议栈的锅。
大概率是MCP的transport配了但没真起来,先netstat看下端口监听没,Ollama那边host别用localhost试试。
我之前也踩过类似的坑,最后发现是MCP的transport配置里host写成了127.0.0.1,而模型服务绑定的是0.0.0.0或者某个具体网卡,导致请求发到了loopback但服务没监听那儿。你可以先用netstat或者lsof确认下模型端实际监听的端口和地址,如果监听在IPv6的::1上,而MCP用的是IPv4,也会出现这种“Connection refused”。另外,Ollama和vLLM默认的API路径不一样,MCP的endpoint得精确到/v1/chat/completions这种层级,不是只写到根路径就行。还有个容易忽略的点是MCP服务本身如果用了异步框架,可能模型请求还没发出去,连接就被客户端关闭了,这时候日志里模型端确实不会有任何记录。建议你在MCP配置里把超时时间调大一点,然后开debug日志看看它到底往哪个IP:PORT发请求,对比一下模型端的实际监听地址,基本就能定位了。如果还不行,试试直接用curl模拟MCP发出的HTTP请求,绕过MCP层,看模型端能不能正常响应,这样能缩小问题范围。
遇过类似的,试试把MCP的transport改成SSE,再确认下endpoint别带/v1,Ollama和vLLM的路径不一样。
我上周刚踩过一模一样的坑,最后发现根本不是MCP的问题,是Llama 3服务本身绑定的host不对。你试试直接用curl打一下模型端的API地址,如果也连不上,那就说明MCP配置压根没到协议栈那一步。Ollama默认监听127.0.0.1,而外部工具走的是另一个网卡,这时候MCP转发请求自然就connection refused了。vLLM的话记得加上--host 0.0.0.0,不然只监听localhost,跨容器或跨机器必然失败。还有个细节,MCP的endpoint路径有时候要和模型服务实际的路径完全一致,比如/v1/chat/completions,别漏了前缀。防火墙查了的话,再看看SELinux或AppArmor,我上次就是被这个卡了两天。你如果用的是Docker部署,记得把端口映射到宿主机的0.0.0.0,不然从外部访问还是会被拒。最后建议把MCP的日志级别调到DEBUG,能看到它实际往哪个IP和端口发的请求,对照一下就能定位了。
大概率是MCP的endpoint绑定了localhost,模型服务监听在别的网卡上,试试改成0.0.0.0。
我之前也卡在这过,大概率不是协议栈的问题,而是MCP的endpoint没绑定到模型服务实际监听的地址上。你试试把MCP里的host从localhost改成127.0.0.1,或者反过来,有时候IPv6和IPv4的解析会把你搞懵。另外确认下模型服务的端口是不是真的在监听,用netstat -tulpn看下,别光看防火墙。Ollama和vLLM默认绑定的接口可能不一样,MCP那边得对应着改,不然就是白折腾。
我也遇到过类似情况,最后发现是MCP的transport配了但health check路径没对上,模型端其实在等一个特定的ping请求。你试试先curl一下模型自身的API地址,确认它能直接通,再检查MCP配置文件里endpoint是不是带了多余的前缀。另外Ollama和vLLM的监听地址可能不一样,一个绑127.0.0.1一个绑0.0.0.0,跨容器或远程调用时容易踩这个坑。