最近在折腾MCP(Model Context Protocol),想把本地部署的Llama 3服务通过MCP暴露给外部工具调用。按照官方文档配置了transport和endpoint,但每次启动服务都报“Connection refused”,日志里显示模型端根本没收到请求。我检查了端口、防火墙,甚至换了不同的模型后端(Ollama和vLLM都试过),还是不行。是不是MCP和模型之间的协议栈有坑?还是我配置里漏了某个关键参数?求大佬指点,卡了两天了,心态快崩了。
部署MCP服务连不上大模型,有人遇到过这种报错吗?
全部回复
共 150 条我上周刚好踩过类似的坑,折腾了三天最后发现是MCP的transport配置里host写成了localhost,但模型服务绑定的是0.0.0.0,结果从MCP进程的视角看localhost指向了IPv6的::1,而模型只监听在IPv4上,connection refused就这么来的。建议你先用curl或者直接python脚本去请求模型端的endpoint,确认从MCP所在的环境能通,然后再检查MCP的配置文件里有没有显式指定IPv4地址。另外Ollama和vLLM的默认端口都不一样,如果你没改过MCP的默认端口配置,它可能还在往Llama原来的8080端口发,但vLLM默认是8000,Ollama是11434,这个错位也会导致一模一样的报错。还有一个点,MCP服务启动时如果没等模型端完全加载完就开始握手,也会出现瞬间的拒绝连接,可以试试在MCP启动脚本里加个sleep或者健康检查重试逻辑。最后建议开一下MCP的debug日志,把HTTP层和传输层的日志分开看,很多时候模型端没收到请求是因为MCP自己就把连接丢掉了,不一定是协议栈的问题,可能只是超时设置太短。
遇到过类似的坑,最后发现是MCP的transport配置里host写成了127.0.0.1,但模型服务绑的是0.0.0.0,看起来能通实际对不上。另外你试试直接用curl调一下MCP暴露的endpoint,如果curl能通但MCP服务报refused,大概率是MCP进程的工作目录或环境变量跟模型服务不一致导致的。还有个冷门点,Ollama和vLLM的API路径不同,MCP配置里endpoint必须精确到/v1/chat/completions这种完整路径,漏了后缀也会静默失败。实在不行把MCP日志级别开到DEBUG,它会打印实际发送的请求URL,一眼就能看出问题。
遇到过类似的坑,最后发现是MCP的transport配置里host写成了localhost,但模型服务绑定的却是0.0.0.0,导致IPv6解析直接拒了连接。你试试把endpoint改成127.0.0.1加端口,或者检查下MCP进程是不是真的在监听那个端口。另外Ollama默认只开在11434,如果MCP配置里写的模型URL带了额外路径,也会出现这种静默拒绝的情况。
大概率是MCP的transport配置和服务地址没对齐,试试用localhost别用127.0.0.1,或者反过来。
我之前也踩过类似的坑,折腾了半天发现根本不是MCP的问题,是Llama服务绑定的host不对。你试试看模型端是不是只监听了127.0.0.1,而MCP容器或外部进程走的是局域网IP,这样必然refused。另外Ollama和vLLM默认的API路径不一样,MCP里配置的endpoint得精确到/v1/chat/completions这种,不能只写到根路径。还有个小细节,有些MCP实现会先发一个health check请求,如果你的模型服务没实现那个接口,连接也会被拒。建议你开一下MCP的debug日志,看看它实际往哪个地址发了什么payload,比瞎猜快多了。最后确认下你用的MCP SDK版本,早期版本对自定义transport的支持有bug,升级到最新版可能就好了。
检查下MCP配置里的host是不是绑了127.0.0.1,外部工具走的是另一个网段吧,我上次就栽这上面。
大概率是MCP的transport配置跟模型服务绑定的host/port没对上,试试把endpoint改成127.0.0.1而不是localhost。
建议先直接curl一下模型端口,确认服务真的在监听,排除掉MCP这层再去调协议。
先确认下MCP配置文件里endpoint是不是填了localhost,模型服务绑的是0.0.0.0,这俩对不上必报connection refused。
先确认下MCP配置里的host是不是写成了127.0.0.1,模型服务监听的可能不是这个地址。
检查下MCP的server地址是不是配成了localhost,模型服务监听的是0.0.0.0,这俩对不上必报connection refused。
我之前也栽在这,后来统一改成127.0.0.1才通,你可以试试。
之前搞MCP连本地模型也踩过类似的坑,后来发现是MCP server的transport配成了streamable-http,但模型服务只开了原生的chat接口,根本对不上。你试试把MCP这层的endpoint直接指向模型的具体路径,别光填host和port,比如/v1/chat/completions这种。另外ollama和vLLM的返回格式不完全一样,MCP解析那边可能要单独适配,你可以先curl一下确认模型端确实能通,再排查MCP侧的协议转换。
这问题我上周也踩过,折腾了三天最后发现是MCP的transport配置里host写成了127.0.0.1,但模型服务实际监听的是0.0.0.0的IPv6地址。你用ollama的话试试把endpoint改成localhost而不是127.0.0.1,或者直接在MCP配置里把reconnect_interval调大点,有时候是服务启动顺序的问题,模型还没完全起来MCP就去连了。另外检查下是不是有代理环境变量在捣乱,我之前就是HTTP_PROXY把本地请求也劫持了。
之前踩过这坑,多半是MCP的transport配了host但没设成0.0.0.0,只监听了localhost。
大概率是base_url没指到/v1,MCP走的是OpenAI兼容接口,直接填根地址必拒。查下这个再试。
可能是healthcheck路径写错了,Llama服务没起来MCP就抢跑,加个重试机制试试。
我之前折腾MCP也卡在这过,后来发现是endpoint配了localhost但模型服务监听的是0.0.0.0,容器或外部访问直接就走不通了。你试试把MCP的target地址改成实际IP,别用回环地址。另外如果用的是Ollama,确认下它有没有开host模式,vLLM那边则要留意下--host参数是不是绑定了特定网卡,这俩坑我都踩过。要是还不行,把MCP的debug日志打开看看握手阶段到底卡在哪一步,比盲猜配置快多了。
遇到过类似的坑,当时也卡了我快一周。你换Ollama和vLLM都不行,那基本可以排除模型后端本身的问题,大概率是MCP侧对endpoint的路径解析和你本地服务的实际路由对不上。比如Llama走的是/v1/chat/completions,但MCP配置里可能默认指向了根路径或者/generate,连接被拒只是表象,实际是HTTP层返回400或404被MCP封装成了connection refused。你可以先用curl直接打一下你配的那个endpoint,看返回什么,如果curl都通,那再检查MCP的transport是用stdio还是HTTP,有时候外部工具走的是HTTP但MCP服务端起的是stdio模式,两边握手都握不上。另外,MCP的配置里有个proxy或者baseUrl字段,容易漏掉,尤其当你的模型服务跑在容器里时,localhost指向的是容器自身而不是宿主机,这个坑我亲眼见同事踩过。还有个冷门的点,新版MCP SDK对TLS验证更严,如果你本地模型服务是HTTP明文,而MCP强制走HTTPS,也会出现类似假死。建议你把MCP的debug日志开到TRACE级别,看它实际往哪个IP端口发了请求,和你的模型监听地址一对比就清楚了。心态别崩,这玩意儿文档是给理想环境写的,真实环境全是细节。
我之前折腾MCP的时候也卡在过这,后来发现根本不是协议栈的问题,是MCP的transport配置里host写成了127.0.0.1,但模型服务监听的是0.0.0.0,导致MCP内部去连的时候走了IPv6的localhost映射,直接connection refused。你试试把MCP的endpoint改成模型服务实际监听的IP,别用localhost,另外确认下MCP的health check路径是不是跟模型服务暴露的ping接口对得上,有些后端要单独开一个/health的endpoint,不然MCP以为服务没起。还有个坑是Ollama默认只绑127.0.0.1,你如果从容器或者远程调,得设OLLAMA_HOST=0.0.0.0再重启,vLLM那边反而要用--host参数显式指定。日志里如果只有MCP的报错没有模型端的访问记录,基本就是MCP压根没把请求发出去,先抓包看下TCP握手有没有成功,而不是盯着应用层日志。另外你检查下MCP的timeout设置,默认5秒有时候模型加载慢一点就断了,但报错会显示成connection refused,实际是服务端没来得及回。实在不行可以开MCP的debug日志,把协议帧打印出来,一眼就能看到它连的是哪个端口。
我上次卡这问题最后发现是MCP配的host写成了127.0.0.1,模型服务监听在0.0.0.0,换过来秒通。
检查下MCP进程和模型服务是不是同一网络命名空间,docker部署的话尤其容易踩这坑。
我之前也踩过这坑,八成不是MCP的问题,是Llama服务监听地址绑到了127.0.0.1,而MCP容器或者外部进程走的是别的网卡。你试试把Ollama或vLLM的host改成0.0.0.0,或者干脆用host.docker.internal这种地址看看。
另外确认下MCP配置里的endpoint是不是带了/api之类的路径,有些模型服务要精确匹配路由,漏了后缀也会connection refused。我上次就是卡在这,日志里安静得吓人。
还有个小排查技巧:先用curl直接打一下模型端的URL,看通不通,能通再回头看MCP配置。防火墙和端口都查过的话,大概率是地址解析或路径映射的细节问题,别急着怀疑协议栈。
大概率是MCP的endpoint配成了localhost,模型服务监听的是0.0.0.0,两边网络栈没对上,试试换成实际IP。
我之前也卡这,后来发现是health check路径没配对,vLLM和Ollama的响应格式不一样,MCP那边要单独适配。