最近在折腾本地部署大模型,想用MCP来管理工具调用,但遇到个头疼的问题。我用ollama跑了qwen2.5,然后按照MCP文档配了客户端和server的config,但一启动客户端就报connection refused。查了半天,发现MCP server默认走的是HTTP还是WebSocket?端口也设了8080,但就是连不上。是不是需要先启动server再启动客户端?我试过先跑server的py脚本,没报错,但客户端那边还是提示“无法建立连接”。有没有大佬遇到过类似情况?或者推荐个靠谱的MCP部署教程?先谢过!
MCP在本地部署大模型时总是连不上,哪里配置不对?
全部回复
共 178 条我之前也踩过这个坑,大概率不是协议的问题,而是ollama的host绑定和MCP server的地址没对上。你试试把ollama服务改成监听0.0.0.0,然后MCP配置里别用localhost,直接用127.0.0.1或者你机器的实际IP,有时候是IPv6和IPv4的解析在捣乱。另外你说的那个connection refused,我猜你client端的base_url可能还带着/api后缀,但MCP server的endpoint是不带这个的,这个细节特别容易忽略。关于HTTP还是WebSocket,MCP现在主流实现其实是走JSON-RPC over stdio,但如果你用的是streamable HTTP模式,那确实得确认server端有没有把CORS和transport都开对,光跑py脚本没报错不代表端口真的在监听。我之前用fastmcp库的时候,必须显式在server代码里加一个uvicorn.run那步,不然脚本退出后端口就自动关了,你试试在server启动后马上netstat看下8080是不是LISTEN状态。要是还不行,直接换官方的mcp-python-sdk里那个echo例子跑通再改你自己的逻辑,别信网上那些二手教程。
大概率是MCP server没监听对地址,试试改成127.0.0.1别用localhost,ollama那边端口也得一致。
我上次也卡这儿,后来发现是client配置里少了个transport参数,补上就好了。
端口8080八成是没绑定对,试试127.0.0.1:8080或者查下server日志里的实际监听地址。
我之前也卡这,后来发现是防火墙把localhost给拦了,关掉就好了。
我之前也卡在这块挺久的,后来发现多半是MCP server监听地址写成了127.0.0.1,而客户端容器或者远程访问走的是局域网IP,自然就refused了。你试试把host改成0.0.0.0,另外确认下ollama和MCP server跑在同一个网络命名空间里,别让防火墙拦了8080。还有个坑是MCP现在有些实现走的是stdio而不是HTTP,得看你用的SDK版本,配置文件里transport别写错了。
我前几天也踩过这个坑,大概率是MCP server监听地址写成了127.0.0.1,而客户端容器或另一个进程访问的是localhost的IPv6解析,试试把host改成0.0.0.0看看。另外确认下ollama的API和MCP的端口别搞混了,8080如果被占用会静默失败,换个端口比如8000再试。启动顺序倒不是关键,但server起来后先用curl测一下健康检查接口,通了再开客户端比较靠谱。
我之前折腾MCP也卡在connection refused上,后来发现是server绑定了127.0.0.1,但客户端配置里写了localhost解析成了IPv6的::1,两边对不上。你试试把server监听地址改成0.0.0.0,或者客户端直接写127.0.0.1,端口别用8080这种容易冲突的,换个像8765这种冷门点的。另外MCP现在主流是走stdio,不是HTTP,如果文档里说WebSocket大概率是版本没对齐,建议直接看官方examples里的python实现,别用第三方教程。
这个我太有同感了,之前搞MCP的时候也被connection refused折磨过。你提到先跑server的py脚本没报错,那问题多半不在服务端本身,我猜是你客户端连的地址跟server监听的不一致,比如server绑的是127.0.0.1,客户端却配了localhost或者局域网IP,或者反过来。另外MCP这块确实有点乱,不同实现有的走HTTP有的走WebSocket,还有走stdio的,你确认下客户端配置里写的协议头是不是跟server端一致,别HTTP和WS混着来。端口8080本身没问题,但得确认server真的监听在那个端口上,可以用netstat或者lsof查一下。还有个坑是防火墙,本地部署有时候会被系统防火墙拦,虽然概率不大但值得排除。我之前是直接改用npx @modelcontextprotocol/server那套官方示例,先跑通最简单的再往上加东西,比一上来就配自己的脚本省心很多。你试试把server的启动日志打全一点,看看有没有绑定失败的提示,有时候它没报错但实际没绑上。
我之前也踩过这个坑,MCP这玩意儿压根不是按你想象的那种“先起server再起client”的固定流程,关键得看它的传输层用的是什么。Ollama那边跑的是本地HTTP API,但MCP的server端如果按官方Python SDK默认走的是stdio,你非要去连8080端口,那肯定connection refused啊。你查到的HTTP或WebSocket其实是两种不同模式,得在client配置里明确指定transport类型,比如用sse或者ws,不然默认连stdio,客户端根本找不到网络端口。另外,你那个server的py脚本虽然没报错,但很可能只是挂在本地监听,没绑定到0.0.0.0,或者防火墙拦了回环以外的请求。建议你先把MCP server的日志打开,看看它实际监听的地址和端口,再确认client的base_url是不是写成了localhost,有时候换成127.0.0.1反而能通。还有一个容易忽略的点,ollama的模型本身不参与MCP握手,MCP只是管理工具调用,你直接在client里测试一个最简单的工具,比如echo,排除模型加载慢导致的超时。如果还不行,直接去翻MCP官方仓库的examples,那里有现成的fastmcp和langchain对接示例,比看文档管用。
我上次也卡在这,八成不是协议问题,是server根本没起来或者绑定的host不对。你试试把server的host设成127.0.0.1,别用0.0.0.0,然后先确认curl一下那个端口能不能通。另外ollama的base_url和MCP的config里别搞混了,这俩是两套东西。
我之前也卡在这过,大概率不是端口问题,是MCP server启动后监听的地址绑定了127.0.0.1,而client那边解析到了localhost的IPv6(::1)上,两边对不上就refused了。你试试把server里host改成0.0.0.0,或者client连的时候直接用127.0.0.1:8080。另外ollama跑的模型跟MCP协议本身没直接关系,MCP管理的是工具调用,你确认下client的transport类型是不是跟server端保持一致,HTTP和WebSocket配置写法差挺多的。
八成是server没监听对端口或绑定了127.0.0.1,试试把host改成0.0.0.0再跑一遍。
我之前也卡在这儿过,大概率不是端口问题,是MCP server的地址配错了,ollama默认绑的是127.0.0.1,但客户端可能走的localhost或者局域网IP,这俩解析不一样就会connection refused。还有,你那个py脚本启动后有没有确认它真的在监听8080?用netstat看一眼最稳。另外MCP现在主流走的是streamable HTTP,不是WebSocket,但有些客户端版本会自动升级协议,建议查一下客户端日志里具体报的什么握手错误。我之前换成在server配置里显式写死host和port,再手动curl一下接口,立刻就通了。
我之前也踩过这个坑,大概率不是协议问题,而是MCP server绑定的host不对,默认可能是127.0.0.1,你客户端用的如果是局域网IP或者容器地址,肯定连不上。另外ollama的API和MCP的端口是两码事,8080得确认是MCP server自己监听的,别混了。建议先curl一下那个地址看通不通,排查网络层比看配置快。教程的话,搜“mcp python sdk example”那个官方仓库里的demo最靠谱,别信博客里写的。
我之前也卡在这块儿好久,后来发现大概率是MCP server绑定地址的问题。默认很多示例代码里是绑到127.0.0.1,但ollama跑在localhost,如果客户端容器化或者走了代理,这个回环地址就完全不通了,改成0.0.0.0试试看。另外你确认下MCP用的是不是SSE传输,新版协议其实支持Streamable HTTP,但很多库默认走的是WebSocket升级,8080端口如果被别的服务占了也会静默失败,用netstat查一下监听状态比较靠谱。还有个小坑是server启动后不会主动打印“ready”日志,你要是只看到py进程在跑,不代表它已经注册成功,得看有没有实际监听socket。我之前就是被这个误导了,后来在server脚本里加了个socket绑定成功的打印,才定位到是端口冲突。教程的话别只看官方文档,GitHub上搜mcp-python-sdk的examples,里面有个echo server,先跑通那个再套你自己的工具,能省不少排查时间。如果还不行,试试把客户端和server都放到同一台机器、同一用户下,权限问题有时候也会导致连接被拒。
我之前也卡在这块儿过,后来发现多半是MCP server和client的协议没对齐。你提到的HTTP还是WebSocket,其实MCP现在主流实现是走的JSON-RPC over stdio或者SSE,但本地部署时很多人图省事直接用HTTP,结果ollama那边默认监听的是127.0.0.1:11434,跟你配的8080完全两码事,connection refused基本就是地址或端口对不上。另外顺序问题确实存在,server得先起,而且要确认它真的监听了你指定的端口,跑个lsof -i:8080看看就知道。还有种坑是config里写了localhost,但server绑的是0.0.0.0,或者反过来,客户端解析不了。我之前用npx @modelcontextprotocol/server-everything做测试,配合ollama反而更稳,建议你直接看官方文档那个“Local Setup”部分,别信太多博客,版本更新太快容易误导。你client端用的是哪个?如果是Python的,检查下transport是不是设成了sse,这个特别容易漏。
八成是server和client的协议没对上,ollama那个端口跟MCP的8080不是一回事,检查下base_url配了没。
大概率是MCP server没监听对地址,ollama默认绑localhost,试试设成0.0.0.0再看端口通不通。
大概率是MCP server绑定了localhost而ollama跑在别的网络命名空间,检查下server监听地址是不是127.0.0.1而不是0.0.0.0。
大概率是地址写错了,ollama默认绑127.0.0.1,MCP别用localhost试试。
我之前也卡在过这里,多半不是协议的问题,而是MCP默认用的其实是stdio,不是HTTP,你配置里写8080端口但它根本没监听这个。可以先试试直接用python跑一下server的py脚本,看它有没有打印出“listening on stdio”之类的日志,能确认它到底走没走网络。另外ollama那边也要确认一下是不是把工具调用映射成了MCP的tool,有时候客户端配置的command路径和参数不对也会直接报连接失败。建议你翻一下官方仓库里的examples,有个quickstart的配置模板,照着改比看文档省事多了。