最近在折腾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部署大模型时总是报错,是配置问题还是我方法不对?
全部回复
共 8 条看到你这个报错我太有共鸣了,之前折腾MCP时也被“handshake failed”折磨了两天。你提到vllm+Qwen2.5-7B这个组合,我怀疑问题可能出在Docker网络模式上——默认bridge模式下容器和宿主机通信有时会丢包或被防火墙拦截,试试把MCP server和客户端都放在同一个host网络里跑,或者显式映射端口到宿主机。另外,Qwen2.5-7B如果用vllm的openai-compatible接口,建议检查下MCP server里配置的base_url是不是写成了localhost,改成宿主机IP试试。allow_origin这个参数一般在跨域请求时才需要,本地开发通常不用管,除非你前端和server在不同容器里。还有个小坑:vllm的某些版本对stream=True的处理和MCP协议握手阶段有冲突,可以尝试在vllm启动参数里加上--disable-stream-outputs。建议你先用curl直接调vllm的/v1/chat/completions接口确认模型本身没问题,再一步步排查MCP的握手逻辑。
我最近也踩过这个坑,handshake failed大概率是MCP server的端口绑定和Docker网络模式没对齐。试试在docker run加个--network host,或者把vllm的API端口显式映射出来。另外Qwen2.5-7B的tokenizer配置里如果用了特殊token,可能和MCP协议要求的上下文格式冲突,建议用默认chat template跑一遍。
可能是docker网络模式没配host,vllm和MCP server跨容器通信容易出这个问题。
握手失败这个问题我折腾过一阵,最后发现是Docker网络模式的问题——默认bridge模式下MCP的ws端口映射容易出幺蛾子,改成host模式或者加个network: host就通了。另外vllm的api接口路径跟MCP默认的/v1/chat/completions可能对不上,你检查下server端配置里的endpoint是不是写成了/v1/completions。还有个小细节,如果启用了防火墙,记得把MCP用的那个端口放行。
我之前也遇到过handshake failed,后来发现是Docker网络模式的问题,默认bridge模式会导致MCP的WebSocket端口映射异常,换成host模式或者加--network=host就正常了。另外vllm和MCP的协议版本确实可能有坑,我用的Qwen2.5-7B-Instruct搭配MCP 0.3.0才稳定,你检查下两边版本号对不对得上。还有allow_origin这个我倒是没设,但如果你客户端不是localhost访问,建议加上试试。
试试把MCP server的host设成0.0.0.0,Docker里默认绑127.0.0.1容易出奇奇怪怪的问题。
我也遇到过类似的handshake failed,折腾了好久才发现是Docker网络模式的问题。你试试把MCP server的network_mode设成host,或者确保客户端能访问到容器映射的端口,有时候docker内部的localhost和外部对不上。另外vllm的API地址检查一下,别漏了/v1/chat/completions这个路径,我之前就是挂在这上面。
我之前也踩过这个坑,vllm加Docker的组合确实容易在握手阶段出问题。试试把MCP server的--host设成0.0.0.0,docker映射端口时别用127.0.0.1,我猜是容器内监听地址没放开。另外检查下vllm服务本身有没有绑定localhost,跨容器通信经常栽在这细节上。如果还不行,贴一下docker-compose或者启动命令的片段?光看error的话,allow_origin通常不会直接导致handshake failed。