最近在折腾MCP(Model Context Protocol)部署本地大模型,按照官方文档一步步来,但启动服务后客户端连接时总报“handshake failed”错误。我试了调整context_window大小和修改tools配置,还是不行。环境是Ubuntu 22.04,用vllm部署的Qwen2.5-7B,MCP server跑在Docker里。怀疑是不是模型版本和MCP协议版本不兼容?或者需要额外设置allow_origin?看GitHub issue里有人说是端口冲突,但我检查过了。求大佬指点一下,这玩意儿是不是有隐藏前提条件?先谢过!
MCP部署大模型时总是报错,是配置问题还是我方法不对?
全部回复
共 186 条我之前也卡在这儿好久,后来发现是Docker网络模式和宿主机回环地址对不上,MCP默认绑的是127.0.0.1,容器里得用host模式或者把地址映射成0.0.0.0才行。另外你用的vllm如果开了多卡或异步调度,MCP那边的timeout设短了也会报handshake failed,试着把服务端的超时参数调大点。协议版本的话Qwen2.5-7B走OpenAI兼容接口应该没啥坑,倒是建议先绕过Docker直接本地跑一遍MCP server,能快速排除是不是容器端口转发的问题。
握手失败大概率不是模型版本的问题,MCP协议跟Qwen2.5的兼容性其实挺好的。我之前也踩过类似的坑,最后发现是Docker网络模式导致的,容器里MCP server监听的是127.0.0.1,宿主机根本连不上,换成host模式或者改绑定0.0.0.0就好了。你可以先看下server端的日志有没有收到连接请求,如果压根没收到那基本就是网络隔离的事。另外allow_origin那个是WebSocket场景才需要管的,跟这个报错关系不大。
检查下Docker网络模式,host模式下MCP的握手端口经常被vllm占用,换bridge试试。
握手失败大概率不是协议版本的问题,MCP这块兼容性其实没那么脆。你Docker里跑的server连宿主机vllm的时候,容器内localhost是回环到容器自己的,得换成host.docker.internal或者宿主机实际IP,这个坑我踩过。另外看下vllm启动时有没有加--enable-auto-tool-choice和对应的tool-call-parser,Qwen2.5的工具调用得显式开,不然握手阶段协商tools就挂。建议先把server日志调到debug级别,客户端连的时候具体卡在哪一步一目了然,比猜快多了。
检查下MCP server容器的网络模式,bridge模式下客户端连localhost是连不上的,得用host网络或者映射端口。
握手失败大多数时候跟模型版本没关系,重点看下MCP server那边有没有收到客户端请求。我之前也遇到过类似的,最后发现是Docker网络模式的问题,容器里的localhost跟宿主机不是一回事,改成host模式或者用宿主机IP就通了。你可以在server端加个verbose日志,看看请求到底有没有打进来,没打进来就是网络层的事。另外检查下MCP的协议版本,客户端和服务端版本差太多确实会握手失败,这个在日志里一般会有提示。