最近在折腾MCP(Model Context Protocol),想把本地部署的Llama 3服务通过MCP暴露给外部工具调用。按照官方文档配置了transport和endpoint,但每次启动服务都报“Connection refused”,日志里显示模型端根本没收到请求。我检查了端口、防火墙,甚至换了不同的模型后端(Ollama和vLLM都试过),还是不行。是不是MCP和模型之间的协议栈有坑?还是我配置里漏了某个关键参数?求大佬指点,卡了两天了,心态快崩了。
部署MCP服务连不上大模型,有人遇到过这种报错吗?
全部回复
共 150 条我之前也踩过类似的坑,最后发现是MCP server端配置的host写成了127.0.0.1,而模型服务跑在docker容器里,网络模式没打通,外部工具通过宿主机IP访问自然就refused了。你可以先确认下MCP的transport到底走的是stdio还是HTTP,如果是HTTP,看看是不是用了sse模式,有些版本对endpoint路径要求很严格,比如必须带/events后缀。另外Ollama和vLLM默认监听地址不一样,Ollama是127.0.0.1:11434,vLLM可能绑定在0.0.0.0,但如果你MCP里写死了localhost,而实际模型服务只监听IPv6,那也会连不上。还有个容易被忽略的点,就是MCP协议本身不负责模型调用,它只是个中间层,你需要确认MCP的tool定义里有没有正确设置model的url,而不是把MCP的endpoint当成模型端点。建议先手动curl一下模型服务的健康检查接口,确认网络通,再用nc或者telnet测MCP暴露的端口,分层排查。如果都通了还不行,看看MCP的日志级别,调成debug,它会打印出实际请求的完整URL,那个信息最直接。卡两天很正常,这玩意儿文档不全,社区里也没个统一标准。
之前折腾过类似的东西,最后发现是MCP的transport默认走stdio,结果我配成sse但忘了在endpoint后面加/sse路径,请求全打到根路径上直接被拒了。你试试直接在浏览器里访问那个endpoint看能不能通,排除一下是不是服务本身没起对。另外Ollama和vLLM的监听地址有时候绑的是127.0.0.1,MCP服务如果跑在容器里访问不到,得改成0.0.0.0。
大概率是MCP默认走stdio,你配成HTTP但模型服务监听地址没对上,试试把endpoint改成localhost别用127.0.0.1。
之前折腾过类似的东西,最后发现是MCP的transport层默认走的是stdio,而外部工具调用走的是HTTP,这俩端口和协议对不上就容易出现你这种Connection refused。你试试把transport明确改成sse或者streamable-http,然后确认endpoint路径和模型服务实际的监听地址完全一致,别漏了/api这种前缀。另外Ollama和vLLM的兼容性确实有区别,vLLM那边可能需要额外开个--api-key参数才能让MCP握手成功,你可以抓包看看是不是卡在认证这一步。
这报错我上周也踩过,最后发现是MCP的transport配置里host写成了127.0.0.1,但模型服务绑在局域网IP上,导致握手直接失败。你可以先curl一下模型端的health接口确认网络通不通,再检查MCP的endpoint是不是用了localhost而模型监听的是0.0.0.0,这俩不匹配必现connection refused。另外Ollama和vLLM的API路径不一样,MCP里如果没按实际的/v1/chat/completions写也会被拒,建议把日志级别开到debug看看具体是TCP层还是HTTP层断的。
我之前也栽这坑里,多半是MCP的endpoint地址配了localhost,模型服务监听的是0.0.0.0,把host改成127.0.0.1试试。
先检查下MCP配置里的endpoint是不是写成了localhost,换成127.0.0.1试试,我之前就这么折腾半天。
我之前也卡在这过,最后发现是MCP的transport配置里host写成了127.0.0.1,但模型服务绑的是0.0.0.0,导致从外部访问时MCP自己先拒了。你试试把MCP那边的endpoint直接指向内网IP,别用localhost,或者反过来统一一下。另外确认下MCP是不是有独立的health check路径,有时候它连的是健康检查端口而不是推理端口,日志里根本看不到请求。
还有个细节,Ollama和vLLM的API路径不一样,MCP默认可能去找/v1/chat/completions,但Ollama是/api/chat,你检查下配置里有没有显式指定模型路由。如果都试过还不行,把MCP的日志级别调到DEBUG,看它到底在解析哪个地址,比瞎猜快多了。
我之前也踩过类似的坑,最后发现根本不是协议栈的问题,而是MCP默认走的那个transport类型跟本地模型的监听方式不匹配。你用的如果是stdio,但模型服务是独立进程,那连接肯定会被拒,必须得切到HTTP或SSE模式,并且把endpoint指到模型实际监听的地址上,别用localhost,试试127.0.0.1,有些环境里解析会出问题。还有个容易忽略的点是Ollama和vLLM默认绑定的host可能不一样,vLLM有时候只监听0.0.0.0但需要额外开--api-key,MCP那边如果配置了空认证头,服务端直接就把握手请求丢了,日志里也看不到。建议你先用curl手动打一下模型的/v1/chat/completions接口,确认裸调用通,再套MCP,这样能快速定位是模型侧还是MCP侧的问题。另外检查下MCP的配置文件里有没有漏了protocolVersion字段,旧版和新版模型服务对协议版本要求很严格,差一个版本就会静默拒绝连接。我上次就是卡在版本号上,官方文档写的默认值跟实际发布版本对不上,改成显式指定就通了。你要是还搞不定,可以试试把MCP的日志级别调到DEBUG,它会在握手阶段打出完整的HTTP请求头,一看就知道哪里断了。
试试把MCP的endpoint改成localhost而不是127.0.0.1,我之前就是被这个坑了,模型端监听地址不一样。
检查下MCP配置里有没有开healthcheck,有些版本默认探活失败就直接拒连,关掉就好了。
试试把MCP的endpoint配成localhost而不是127.0.0.1,有些服务只绑了IPv6,坑过我好几次。
大概率是MCP的endpoint配成127.0.0.1了,模型服务监听的是0.0.0.0,改成宿主机IP试试。
遇到Connection refused其实大概率不是MCP协议栈的问题,而是MCP服务端在尝试连接模型时用的地址或端口跟你本地实际监听的不一致。我之前踩过类似的坑,Ollama默认监听127.0.0.1:11434,但如果你在MCP配置里写了localhost或者更糟直接用了容器IP,在部分网络环境下就会变成IPv6解析失败,表现就是拒连。建议你先用curl直接测一下模型API能不能通,排除模型端本身的问题,然后再看MCP的配置文件里有没有单独的transport层超时或者重试设置。另外你提到vLLM也试过,vLLM默认的API路径是/v1/completions,但MCP有些实现会硬编码成/v1/chat/completions,这个不匹配日志里不一定显式报错,只是默默拒绝。还有个小细节,有些MCP框架要求显式声明health check端点,不然即使模型活着它也不认为可用。你可以把日志级别调到DEBUG,看MCP到底在尝试连接哪个具体socket,这一步比瞎猜快很多。卡两天很正常,这种集成问题往往就是某个默认值在作怪。
先确认下MCP的transport配置是不是用了SSE模式,Llama服务那边得开对应端口转发,我上次就是漏了这个。
遇到过类似的坑,最后发现不是MCP本身的问题,而是Llama服务监听的地址不对。你试试看本地直接curl一下模型端的API,如果通的话再查MCP的transport配置,大概率是host写成了127.0.0.1而模型绑的是0.0.0.0,或者反过来。另外Ollama和vLLM默认的端口不一样,你MCP里配的endpoint是不是跟实际服务端口对不上?我之前就是漏了把vLLM的额外参数里加上--host 0.0.0.0,导致外部连接全被拒。还有一种可能是MCP的server端和client端用的协议版本不匹配,你检查下两边依赖的mcp库版本,有时小版本差异就会导致握手失败。实在不行可以开debug日志看下具体是哪一步抛的异常,别只看Connection refused,后面跟的errno有时候能直接告诉你答案。卡两天确实折磨,但这类问题八成是环境细节,别急着怀疑协议栈。
遇到过类似的,当时折腾半天发现是MCP的transport配置里host写成了127.0.0.1,但模型服务绑在0.0.0.0上,两边根本不在一个网络栈里。另外确认下MCP的endpoint路径是不是带上了/api,像Ollama和vLLM的接口路径不一样,这个特别容易漏。还有个思路,先不用MCP,直接用curl打一下模型服务的原始HTTP接口,确认链路通不通,再排查MCP层。
先确认下MCP配置里的host是不是写了localhost,有时候服务绑的是127.0.0.1但工具端在连别的地址。
试试把MCP的transport改成SSE再配个流式代理,我之前也卡在这,后来发现是Ollama默认绑了127.0.0.1,外部访问直接被拒。
我之前也卡在这过,后来发现是MCP的transport配置里host写成了127.0.0.1,但模型服务实际监听的是0.0.0.0,导致请求发到本地回环地址被拒。你检查下MCP服务端那个endpoint是不是用了localhost,换成实际绑定的IP试试。另外Ollama和vLLM默认端口不一样,确认下MCP里填的端口跟模型服务真正监听的端口对得上,我之前就是vLLM开了8000但MCP里写的是11434,白折腾半天。
大概率是MCP的SDK版本和模型服务不兼容,试试把MCP的transport换成streamable-http,别用默认的sse。