最近在折腾MCP(Model Context Protocol),想把本地部署的Llama 3服务通过MCP暴露给外部工具调用。按照官方文档配置了transport和endpoint,但每次启动服务都报“Connection refused”,日志里显示模型端根本没收到请求。我检查了端口、防火墙,甚至换了不同的模型后端(Ollama和vLLM都试过),还是不行。是不是MCP和模型之间的协议栈有坑?还是我配置里漏了某个关键参数?求大佬指点,卡了两天了,心态快崩了。
部署MCP服务连不上大模型,有人遇到过这种报错吗?
全部回复
共 150 条我也遇到过类似的情况,当时也是MCP连本地模型,折腾了一晚上。你试了Ollama和vLLM都不行,那问题大概率不在模型后端本身,而是在MCP的health check或者endpoint路径上。很多MCP实现默认会先请求一个/health或者/status的探活接口,如果你的模型服务没开这个路由,连接就会被直接掐断,日志里看起来就像“Connection refused”但实际是协议握手失败。你可以用curl手动打一下你配置的那个endpoint,看看返回的是不是200,如果是404或者405,那基本就是路径没对上。另外,检查下MCP的transport配置,是不是用了streamable HTTP但实际模型端只支持SSE,这种不匹配也会导致连接被拒。我之前就是把transport从http切到sse立马就好了。还有一个坑是host绑定,本地模型如果只监听127.0.0.1,而MCP服务跑在容器或者另一个网络命名空间里,就会连不上,可以试试把模型服务的host改成0.0.0.0。建议你先抓个包或者开debug日志,看看MCP到底往哪个地址发了什么请求,比瞎猜效率高。心态别崩,这玩意儿配置起来就是很多隐性条件,多打日志排查很快的。
遇到过类似的坑,问题大概率不在MCP协议本身,而是transport配置里的host和port写的是localhost,但模型服务实际监听的是0.0.0.0或者IPv6地址。你试试把MCP的endpoint改成127.0.0.1显式指定,另外确认下Ollama/vLLM的API路径是不是带版本前缀,比如/v1/chat/completions,MCP默认可能不会自动拼接。如果还不行,建议抓包看下MCP启动时是否真的发起了TCP握手,有时候是配置文件的JSON格式错了导致根本没加载。
你试试把MCP的endpoint改成127.0.0.1别用localhost,有些代理会劫持解析导致连不上。
我之前也卡这问题,最后发现是MCP服务里没配模型地址的base_url,默认走8080就拒了。
检查下MCP配置里endpoint是不是用了localhost,模型服务绑定了127.0.0.1的话,外部工具走网络栈就会拒连。我之前就是栽在这上面。
之前折腾MCP接本地模型也踩过类似的坑,后来发现是transport配的sse但模型那边实际只开了stdio,两边对不上就一直connection refused。你可以先确认下MCP server是不是真的监听在预期的host和port上,有时候默认绑了127.0.0.1但外部工具走的是局域网IP。另外Ollama和vLLM的endpoint路径不太一样,试试直接用curl打一下模型接口看通不通,能通再排查MCP那层。要是还不行,看看MCP的日志级别调到debug,一般会打印出具体卡在哪一步。
查下MCP的sse路径配没配,Llama那边要开stream模式,我之前就是这个坑。
你试试直接用curl打一下MCP的endpoint,先确认服务本身通不通,别急着连模型。
遇到这种问题确实容易上头,我前几天也踩了个类似的坑,不过场景是MCP连远程的embedding服务。你检查过MCP的transport配置里那个endpoint的路径吗?有些实现默认走的是/xxx/mcp这种特定路由,不是单纯的主机加端口,如果模型端没暴露对应的handler,就会一直connection refused,但日志又看不出来。还有,Ollama和vLLM对MCP的支持方式不太一样,Ollama那边需要额外装个适配层,vLLM则要确认下有没有开启--api-server的额外参数,不然MCP发的JSON-RPC请求会被当成普通HTTP请求拒掉。另外你试过用命令行工具比如curl直接往那个endpoint发个测试payload吗?如果curl都通不过,那问题大概率不在MCP协议,而在服务路由或者鉴权头没带对。我之前就是忽略了MCP要求的Content-Type必须是application/json,默认发成text/plain,服务端直接不认。还有个思路,可以看看MCP官方client的示例配置,对比下和你写的差异,尤其是那个“streamableHttpTransport”和普通“httpTransport”的区分,很多新手都会搞混。实在不行把日志级别调到DEBUG,MCP和模型端都开,看下握手阶段到底卡在哪一步。
我上周也踩过类似的坑,最后发现是MCP的transport配置里有个host参数默认绑了127.0.0.1,而模型服务跑在docker容器里,两边网络栈没打通。你可以试试把transport改成走stdio或者干脆用localhost先排除网络问题,另外检查下MCP的health check路径是不是跟模型服务暴露的接口对得上,有些框架会默认加个/api前缀。
大概率是MCP服务监听地址写成了localhost,外部工具走了127.0.0.1的IPv6,试试绑0.0.0.0加双栈。
我之前也卡在这,最后发现是transport配了sse但模型端只开了stdio,两边对不上。
遇到这种问题先别急着怀疑MCP协议栈,我上次折腾也卡在类似地方。你检查过MCP配置里的host绑定吗?有时候默认绑到127.0.0.1,外部工具访问就走不通了,改成0.0.0.0试试。另外Ollama和vLLM默认的API路径不一样,MCP里endpoint得写全,比如/v1/chat/completions这种,漏了后缀就是白搭。我之前就是被这个坑了两天,日志还特别迷惑。
先确认下MCP的endpoint是不是填了模型服务的实际地址,我之前就是默认写成了localhost结果容器里访问不到。
我之前折腾MCP的时候也撞过这堵墙,后来发现多半不是协议栈的问题,而是MCP客户端默认走的是stdio,你如果直接配了个HTTP或SSE的endpoint,它压根不会往那个端口发请求。你检查下启动MCP服务时用的命令,是不是漏了--transport sse或者对应的参数,很多官方文档的示例都是针对远程服务器的,本地部署反而容易踩这个坑。另外你日志里“Connection refused”是出现在客户端还是服务端?如果是客户端报的,那基本可以确定是它没连上你监听的地址,而不是模型端的问题。还有个小细节,Ollama和vLLM默认绑定的host可能都是127.0.0.1,但MCP服务如果跑在容器里或者用了不同的网络命名空间,就会互相看不到,你试试把模型后端的host改成0.0.0.0再绑个具体端口。最后建议你直接用curl模拟MCP的initialize请求打一下endpoint,能通的话再排查工具侧,不能通就说明问题出在MCP服务自身的路由或认证上,跟大模型关系不大。卡两天确实烦,但这类问题基本都是配置盲区,理清链路就好办了。
遇到过类似的坑,最后发现是MCP的transport配置里host写成了127.0.0.1,但模型服务绑在了0.0.0.0上,两边对不上。你试试把MCP的endpoint直接指向模型服务的实际监听地址,别用localhost,有时候vLLM和Ollama默认绑的端口不一样。另外检查下MCP服务有没有独立的health check路径,有些版本会先探活再转发,探活失败就直接connection refused了。
我之前也卡这过,后来发现是MCP配的host用了localhost,模型服务绑的是127.0.0.1,改成一致就好了,你试试看。
试试把MCP的endpoint改成localhost而不是127.0.0.1,有些版本对IPv6的解析会直接拒连。我之前卡了一整天就是这么解决的。
前两天刚趟过这个坑,多半不是协议栈的问题,而是MCP server监听的地址和模型服务不在同一网络命名空间里。你试试把MCP的transport改成sse模式,然后endpoint直接指向Llama的/v1/chat/completions,别用默认的根路径。还有个隐蔽点,Ollama默认只绑127.0.0.1,如果MCP跑在容器里就得设host.docker.internal,vLLM同理要确认--host参数。实在不行就在MCP配置里加个health check的URL,能直观看到连通性。
我之前也踩过类似的坑,最后发现是MCP的transport配置里host写成了127.0.0.1,而模型服务绑的是内网IP,两边对不上就直接connection refused了。你试试把MCP的endpoint改成模型服务实际监听的IP和端口,别用localhost。另外,如果用的是Ollama,记得确认它的API路径是不是/v1,MCP默认可能拼接了别的路由,这个也容易忽略。
遇到过类似的坑,最后发现根本不是协议栈的问题,而是MCP的transport层默认绑定了localhost,但你的Llama服务监听的是0.0.0.0或者另一个网卡,导致MCP转发请求时目标地址压根不对。你可以先用curl直接打一下模型端的endpoint,确认外部访问通不通,如果curl都连不上,那MCP这边配置再对也没用。
另外有个细节容易漏,Ollama和vLLM的API路径不一样,Ollama是/api/generate,vLLM是/v1/completions,MCP配置里的endpoint得精确到具体接口路径,我当初就是少了个/api前缀,日志里一直显示connection refused但实际是404被吞了。还有检查下MCP服务启动时的环境变量,有些版本会读HTTP_PROXY,如果你本机有代理,请求会被强行转发到不存在的代理端口上。
最笨但有效的办法是开tcpdump或者用nc监听端口看握手包,如果MCP发出SYN但模型端没回ACK,那基本就是网络层的问题。我最后是把MCP的transport从stdio换成sse模式才解决,如果你用的默认stdio,外部工具连接时可能没正确建立会话,也会表现为拒绝连接。别崩,这玩意儿文档写得稀烂,实际踩坑的人多了去了。
遇到过类似的坑,最后发现是MCP的transport配置里host写成了127.0.0.1,但模型服务实际绑定的地址是0.0.0.0,两边网络栈对不上导致的。另外你检查下MCP的启动顺序,它有时候会先尝试连接模型端再初始化自身服务,如果模型端加载慢就会出现这种假性拒绝。还有个小细节,Ollama的默认端口是11434,但MCP配置里如果漏了路径前缀(比如/v1),也会表现成connection refused。建议先curl一下模型端的健康检查接口,确认从MCP所在机器能直通,再排查协议层。
遇到过类似的坑,最后发现是MCP的transport配置里host写成了127.0.0.1,但模型服务绑的是0.0.0.0,两边没对上。你试试把MCP的endpoint直接指向模型服务的实际监听地址,别用localhost。另外Ollama和vLLM的API路径不一样,确认下MCP配置里的路径是不是严格匹配,比如/v1/chat/completions这种。卡两天太正常了,这玩意儿文档写得跟老太太裹脚布似的,多翻翻GitHub issue吧。