最近跟着教程折腾MCP,用的官方Python SDK写了个简单的服务器,暴露了一个查询本地SQLite的函数。在Claude Desktop里配好mcpServers,启动后日志显示“Transport closed”,连initialize握手都没完成。我确认了URL是http://localhost:8000/mcp,也试过用--transport sse和streamable-http两种模式,都不行。
MCP服务器连自家API都连不上,是我配置姿势不对还是这玩意儿本来就难搞?
全部回复
共 47 条我之前搞streamable-http的时候也踩过类似的坑,后来发现是路径没对齐。官方文档里写的是/mcp,但实际SDK默认挂载点可能是/mcp/,或者反过来,就差这一个斜杠,握手直接断。你确认下服务端打印的完整路由列表,别光看教程里的配置。另外Claude Desktop对SSE的支持其实挺老的,很多版本走的是text/event-stream那套,如果SDK默认发的是application/json,它根本不认。我最后是抓包看了下请求头,发现content-type不对,手动改回text/event-stream才通的。还有个小细节,如果你本地开了代理或者防火墙,localhost的回环地址可能被拦,试试用127.0.0.1代替localhost。日志里Transport closed太笼统了,建议把服务端日志级别调到DEBUG,看是连接被拒还是协议解析报错。说实话这玩意儿对新手不太友好,官方示例跟实际版本脱节挺严重的,你可以试试直接看SDK源码里的transport实现,比文档管用。
我上周也被这个坑过,后来发现是Claude Desktop的MCP客户端默认走的是stdio,对http端点支持很挑版本。你试试把SDK升到最新,然后服务器端显式打印一下收到的请求头,看是不是Content-Type没对上。另外确认下防火墙或者代理有没有拦localhost,我那次就是公司VPN把本地回环给拦了。
我也踩过一模一样的坑,后来发现问题多半不在SDK而在Claude Desktop对传输方式的严格限制上。你试试直接用mcp命令在终端里跑客户端测一下,能通的话就说明服务端没问题,再回头检查配置里的URL是不是漏了/sse后缀。另外如果是新版Claude,streamable-http需要服务端支持Accept: text/event-stream头,官方SDK默认可能没开,得手动加个中间件。
大概率是Claude Desktop对本地地址的CORS或协议版本有硬性要求,你试试把transport改成path模式再配个固定端口。
我上次也卡这,后来发现是base url多了个/mcp,去掉就通了,要不你试试?
八成是Claude Desktop对本地回环地址有限制,试试把host改成0.0.0.0或者用ngrok暴露下端口。
我之前也卡在过这个握手阶段,后来发现十有八九是路径和协议没对齐。你注意下Claude Desktop里那个mcpServers配置,它默认走的是http的SSE,但SDK新版可能默认起了streamable-http,两边不匹配就会直接Transport closed。可以先在浏览器里手动访问下那个URL,看能不能拉到SSE的响应头,如果返回的是JSON而不是text/event-stream,那基本就是模式没对上。另外本地回环的话,别用localhost,试试127.0.0.1,有时候IPv6解析会捣乱。还有就是官方Python SDK最近改版挺频繁的,你检查下mcp.server.sse是不是被废弃了,换成了streamablehttp的入口函数。我之前折腾半天,最后是直接降级到某个稳定版本才通的,这玩意儿确实对版本兼容很敏感,不是你姿势的问题。