最近在折腾MCP(Model Context Protocol),想把家里的NAS(群晖DS920+)当个常驻服务器,跑一些自用的MCP工具(比如文件管理和定时任务)。我用Docker部署了官方SDK的stdio版,然后转成SSE模式,端口映射了8899,本机curl localhost:8899能通,但手机和另一台电脑通过局域网IP访问就是超时。
MCP服务部署在NAS上,局域网其他设备连不上,是配置问题还是姿势不对?
全部回复
共 127 条本机 curl 能通说明服务本身没毛病,问题基本出在监听地址上。很多 Docker 镜像默认只绑 127.0.0.1,你在容器里得让它监听 0.0.0.0,光映射端口没用。群晖的防火墙也顺手看一眼,8899 有没有放行,DSM 自带那套规则挺容易漏的。我之前也踩过这坑,查了半天最后发现是绑回环了。
本机curl通说明服务本身没毛病,大概率是绑定的问题。很多SDK默认listen在127.0.0.1上,你映射了端口但容器里只监听回环地址,外面当然连不上,改成0.0.0.0试试。另外群晖的防火墙也顺手看一下,8899有没有放行,别只盯着Docker。我之前也踩过这坑,卡了半天才发现是绑定地址。
群晖上跑Docker有个坑,默认桥接网络下容器只监听容器内部的端口,你得确认SSE服务是绑在0.0.0.0而不是127.0.0.1,很多人本机curl能通就是因为这个。另外群晖自带防火墙默认会拦非标准端口,去控制面板安全里看看8899有没有放行。我之前也遇到过类似的,最后发现是docker-compose里端口写成了127.0.0.1:8899:8899,改成8899:8899就好了。
SSE默认只绑了127.0.0.1吧,改成0.0.0.0再试试,群晖防火墙也要放行8899。
这个坑我踩过,大概率不是MCP本身的问题,而是监听地址绑错了。你本机curl能通,说明服务确实起来了,但很多SDK默认只bind 127.0.0.1,外面自然连不进来,得改成0.0.0.0才行。群晖这边还要注意Docker的网络模式,桥接的话端口映射要确认是TCP,别整成UDP了。另外群晖自带的防火墙有时候会默默拦掉非标准端口,8899不在白名单里就很容易超时,可以先临时关掉防火墙测一下。还有个容易忽略的点,SSE模式对客户端请求头有要求,比如Accept得带text/event-stream,手机端如果用的是普通HTTP请求可能直接就被拒了。我之前也是折腾半天,最后发现是监听地址加防火墙两个问题叠在一起,改完就通了。建议你先在NAS上netstat看下实际监听的是哪个地址,比瞎猜快多了。
群晖防火墙默认会拦非本地网段,去控制面板把8899加进允许列表试试。
群晖上跑Docker最容易踩这个坑,先确认一下容器是不是绑定了127.0.0.1,SSE模式如果监听地址写的是localhost,那端口映射出去也没用,得改成0.0.0.0。我之前也是本机curl通、别的设备超时,折腾半天才发现是bind address的问题。另外群晖自带防火墙默认会拦非本地网段,去控制面板里看一眼有没有放行8899。