最近在折腾MCP(Model Context Protocol),想把本地部署的Llama 3服务通过MCP暴露给外部工具调用。按照官方文档配置了transport和endpoint,但每次启动服务都报“Connection refused”,日志里显示模型端根本没收到请求。我检查了端口、防火墙,甚至换了不同的模型后端(Ollama和vLLM都试过),还是不行。是不是MCP和模型之间的协议栈有坑?还是我配置里漏了某个关键参数?求大佬指点,卡了两天了,心态快崩了。
部署MCP服务连不上大模型,有人遇到过这种报错吗?
全部回复
共 150 条我之前也踩过类似的坑,最后发现是MCP配置里的host写成了127.0.0.1,而模型服务实际监听的却是0.0.0.0,导致从外部进程连接时直接拒了。你检查一下transport的地址是不是和模型端绑定的IP完全一致,另外确认下MCP服务启动时是否用了单独的虚拟环境,有时候依赖版本冲突也会让连接静默失败。如果还不行,试试用nc -zv手动测一下那个端口的连通性,排除是MCP自身的问题。
我也遇到过这个报错,折腾了两三天才搞明白,所以特别能理解你的心态。我当时的问题出在MCP的transport配置上,如果你用的是streamable HTTP,它默认会走一个特定的endpoint路径,而本地模型服务(比如Ollama)监听的是另一个路径,两者没对上就直接connection refused。建议你抓一下实际发出的请求,看看它到底打在哪个端口和URI上,而不是只看模型端的日志。另外,有个容易忽略的点是MCP服务本身需要先完成初始化握手,如果你的客户端工具在握手完成前就发请求,也会被拒绝。我后来换成stdio模式做本地调试,绕开了网络层,确认模型本身没问题,再切回HTTP排查配置就快多了。还有个偏方,试试在MCP配置里显式指定host为127.0.0.1而不是localhost,有些环境IPv6解析会坑你一下。卡两天不算啥,这玩意文档写得稀烂,社区里一堆人踩同一个坑,慢慢来。
我之前也卡在这过,最后发现是MCP的transport配置里host写成了127.0.0.1,但模型服务监听的是0.0.0.0,两边网络栈对不上。你可以先curl一下模型端的health接口确认能通,再回头查MCP的endpoint是不是用了localhost或者IPv6。另外如果用的是Ollama,记得把OLLAMA_HOST设成0.0.0.0,默认只绑本机回环。vLLM那边反而简单,直接看--host参数就行。
遇到过类似的坑,最后发现是MCP的transport配置里host写成了localhost,而模型服务绑的是127.0.0.1的IPv6,vLLM那边默认只监听具体IP,改了下endpoint指向实际监听地址就好了。你试试直接curl一下模型服务的health接口,确认从MCP容器或进程能通。另外如果用的是Ollama,注意它默认端口是11434,vLLM是8000,别在MCP配置里搞混了。协议栈一般没大问题,多数是网络层和监听地址的细节。
遇到过类似的坑,最后发现是MCP的transport配置里host写成了127.0.0.1,而模型服务绑的是0.0.0.0,导致请求根本没走到模型那边。你试试把MCP的endpoint直接指向模型服务的实际监听地址,别用localhost,另外确认下有没有开streaming模式,有些后端默认关闭会触发连接重置。
之前搞过类似的,MCP那层本身一般没问题,问题多半出在模型服务的监听地址上。Ollama默认绑的是127.0.0.1,如果你MCP容器或者进程跑在别的网络命名空间里,就会直接connection refused,试试把OLLAMA_HOST设成0.0.0.0。另外vLLM的话得确认下--host参数是不是配了0.0.0.0,不然光端口放行没用。再一个坑是MCP的endpoint路径,有些实现会要求带版本号比如/v1/chat/completions,你直接填根路径也会报错。建议先curl一下模型那个端口,能通再排查MCP配置。
我之前也卡在过类似的地方,搞了大半天发现根本不是MCP配置的问题,而是Llama服务本身没绑定到正确的网络接口上。你试试直接curl一下模型端的地址,如果本机能通但外部工具不通,大概率是监听地址写成了127.0.0.1而不是0.0.0.0。另外,Ollama和vLLM虽然都能用,但它们默认的API路径和返回格式不完全一样,MCP这边如果用了硬编码的path,很容易出现“连上了但握手失败”的情况,日志里不一定有明确报错。还有一个容易被忽略的坑是MCP的transport层,如果你用的是streamable HTTP,那模型端必须支持SSE,而vLLM默认的completions接口是不带流式事件的,得单独起一个OpenAI兼容的server。建议你先把MCP的日志级别调到debug,看它到底在哪一步断的,是TCP层拒绝还是HTTP层超时。如果方便的话,可以贴一下你MCP配置里endpoint的完整URL,我之前就是漏了/v1这个前缀,折腾了整整一个周末。
听着像是MCP的transport层绑到了127.0.0.1,而模型服务监听的是别的网卡,试试把endpoint换成0.0.0.0。
遇到过类似的坑,最后发现是MCP的transport配置里host写成了127.0.0.1,但模型服务绑的是0.0.0.0,两边对不上。你检查下MCP服务日志里实际监听地址和模型端的绑定地址是不是一致,有时候防火墙放行了但端口映射没生效。另外,如果用的Ollama,它默认只监听localhost,需要设置OLLAMA_HOST=0.0.0.0重启才行,vLLM那边倒是没这问题。
我也遇到过类似的情况,当时差点把电脑砸了。后来发现根本不是MCP的问题,是Llama 3的API服务默认绑定在127.0.0.1上,而MCP的transport如果走的是0.0.0.0或者docker网络,就会直接connection refused。你试试在启动Ollama或vLLM的时候加个--host 0.0.0.0,或者确认一下MCP配置里的endpoint是不是真的能从这个进程访问到模型服务的地址,别光看端口通不通,有时候是绑定地址不对。
另外你提到换了后端还是不行,那大概率不是模型端的问题,而是MCP server本身没起来。你可以先用curl直接打一下模型API,确认外部工具能访问到,然后再看MCP的日志,它报的connection refused到底是指向哪个地址。我之前就是被MCP的配置文件坑了,它默认会去连localhost,但我的服务跑在另一个容器里,得显式写完整IP。
还有个小细节,MCP有些版本对超时很敏感,如果模型响应慢,连接会被误判为拒绝。你试试把超时时间调大点,或者先跑一个极简的测试工具,比如用nc或者python脚本模拟请求,先排除MCP封装层的问题。别急着怀疑协议栈,大概率是网络或配置层面的小坑。
遇到过类似的,当时折腾半天发现是MCP server默认绑定了127.0.0.1,而模型服务跑在另一个容器里,网络命名空间都不一样,肯定连不上。你可以先确认下MCP进程和模型后端是不是在同一网络环境,试试把host改成0.0.0.0或者直接用宿主机IP。另外Ollama和vLLM默认监听端口不一样,你看看MCP配置里的endpoint是不是写死了某个端口,跟实际对不上。
还有一个容易忽略的点,就是MCP在启动时会先做健康检查,如果模型端还没完全加载完模型权重,这个检查就会失败,导致后续请求全被拒。我后来在MCP配置里加了条初始化延迟参数就好了,你可以查查文档里有没有类似timeout或retry的配置项。
我之前也踩过类似的坑,最后发现是MCP的transport配置里host写成了127.0.0.1,但模型服务绑的是0.0.0.0,结果从MCP侧发请求时走了IPv6的localhost解析,直接connection refused。你先确认下MCP日志里实际连接的IP和端口是不是和你模型服务监听的一致,特别是vLLM默认绑的是8000,但MCP配置里endpoint如果带了额外路径,比如/v1,也会导致握手失败。另外Ollama的话,它默认只监听本地回环,如果你是通过Docker跑MCP,那容器内的localhost和宿主机不是一回事,得用host.docker.internal或者宿主机IP。还有个容易忽略的点,MCP协议现在有些版本要求先发initialize请求,如果模型端返回的响应格式不符合MCP的JSON-RPC规范,连接会被直接掐断,但日志里只显示refused,不会提示协议错误。你试试用curl手动模拟MCP的初始化请求,看模型端到底回什么,这样能定位是网络层问题还是协议层问题。如果curl能通但MCP不行,那大概率是MCP的keep-alive或超时设置跟模型端的空闲断开机制冲突了,把MCP那边的idleTimeout调大点试试。
遇到过类似的坑,最后发现是MCP的transport配置里endpoint写成了HTTP但模型服务绑的是Unix socket,两边协议栈压根对不上。你试试直接用curl去请求Llama的地址,如果通的话,再检查MCP配置里的timeout和重试机制,有时候模型加载慢也会误报connection refused。另外Ollama和vLLM的默认端口不一样,你是不是只改了模型后端没同步改MCP里的端口号?
我之前搞MCP也卡在这过,最后发现是sse transport的路径配错了,MCP默认走/sse而不是根路径,你试试在endpoint后面加上/sse。另外Ollama的话记得确认下它的host是不是绑在127.0.0.1,外部工具调的时候得用局域网IP,不然必然connection refused。
我之前折腾MCP也卡在过类似的地方,最后发现是transport配成了streamable-http但vLLM那边只开了OpenAI兼容端口,压根没监听MCP那个路径。你试试直接用curl打一下endpoint看返回啥,如果连握手都失败,基本就是协议栈没对齐,别光看防火墙。另外Ollama的话,它的原生接口和MCP的tool calling格式不兼容,得走中间层转换,这个坑我踩过。你日志里有没有更详细的HTTP状态码?贴出来可能更直观。
遇到connection refused先别急着怀疑协议栈,大概率还是网络层的问题。我之前也卡过类似情况,最后发现是MCP服务监听的host设成了127.0.0.1,而模型跑在另一个容器里,等于请求根本没出宿主机。你试试把transport的host改成0.0.0.0,或者直接用docker的host网络模式跑一下。另外检查下MCP配置里的endpoint是不是带上了/api之类的路径,有些模型服务需要特定路由前缀,这个文档里经常不写清楚。
我之前也卡在这过,问题可能不在协议栈,而是MCP的transport默认绑的是localhost,外部工具或者容器里访问就得用实际IP或host.docker.internal。另外你检查下有没有配health check,有些框架会先探测模型健康状态,探测不过就直接拒连。日志里如果只有MCP的报错没有模型端的log,大概率是请求根本没到模型那层,可以先用curl直接打一下模型endpoint确认通不通。Ollama和vLLM都试过还不行,那基本可以排除模型本身的问题,重点查下MCP服务启动时用的环境变量,比如BASE_URL或者API_KEY是不是被写死了。
我前两天刚踩过这个坑,最后发现是MCP的endpoint配成了localhost,但模型服务绑的是0.0.0.0,两边协议栈其实没问题,就是地址解析的锅。你试试在MCP配置里直接把endpoint改成具体的局域网IP或者127.0.0.1,别用localhost,有时候系统解析顺序会绕到IPv6上去。另外确认一下模型服务的health check路径,MCP默认会先探活,探不到就直接拒连,这个很容易被忽略。
是不是只配了MCP的transport,忘了把模型服务绑到对外可访问的地址上?试试把host改成0.0.0.0。
遇到过类似的坑,最后发现是MCP的health check路径跟模型服务实际监听的路径对不上,Ollama和vLLM的默认endpoint不一样,得在MCP配置里显式指定/v1/models这种。另外确认下MCP服务启动时有没有绑定到127.0.0.1而不是0.0.0.0,外部工具访问本地端口也会被拒。我之前还踩过timeout设置太短的雷,握手慢一点就直接connection refused,把超时调大点试试。