最近刚上手MCP,想用Cursor搭个本地服务器试水,结果折腾了两天。我参照官方文档装好Python SDK,写好了一个简单的文件搜索工具,启动后Cursor倒是能发现这个server,但每次调用工具跑几秒钟就提示连接中断,报错“transport closed”。我试过换端口、关防火墙,甚至还重启了电脑,问题依旧。是不是MCP的传输协议对本地socket有什么特殊要求?还是我代码里异步处理写错了?感觉网上资料太零散了,求大佬指点一个稳定的入门配置。
MCP服务器连Cursor老是断联,是我姿势不对吗?
全部回复
共 148 条这问题我也踩过,多半不是协议问题,而是MCP server端没处理好keep-alive或者单次请求超时。你可以试试在server初始化时把心跳检测间隔调短一点,或者给工具调用加个超时重试逻辑,Cursor那边对空闲连接回收很激进。另外如果你的工具是同步阻塞的,记得用asyncio.to_thread包一下,别卡住事件循环。我上次就是这么解决的,改完再没断过。
碰到transport closed大概率不是姿势问题,是stdio传输模式下子进程生命周期没管好,Cursor那边超时就把管道掐了。你可以试试把server改成sse模式跑在本地端口上,然后连接地址填http://127.0.0.1:8000/sse,这样断联至少能看得见日志。另外检查下你的异步函数有没有在event loop里阻塞,比如用了同步的os.walk,那几秒卡顿足够触发心跳超时了。我自己用fastmcp库重写一遍后就没再犯过这毛病,建议你换那个试试,配置文档比官方SDK友好太多。
我之前也踩过这个坑,后来发现多半不是传输协议的问题,而是MCP server端默认的stdio生命周期跟Cursor的保活机制对不上。你试试在代码里给读取操作加个超时时间,或者干脆把工具改成同步阻塞模式,我这么改完就稳了。另外检查下是不是Python SDK版本太新,有些版本异步循环跟Cursor的兼容性确实有bug,锁到0.9.x试试。
我前几天也踩过这个坑,后来发现多半不是协议的问题,而是MCP server端那个stdio传输的进程生命周期没管好。Cursor连着的是子进程,如果你代码里用了asyncio但没正确维护事件循环,或者SDK版本和Cursor内置的MCP客户端不兼容,跑几下就会把管道给关掉。建议你先在终端里直接跑server看有没有异常输出,排查是不是代码里某个方法抛了未捕获的异常,因为transport closed很多时候是服务端主动挂断的。另外你用的Python SDK是官方那个mcp包吗?如果是0.9.x之前的版本,跟Cursor的握手逻辑有已知的兼容性bug,升级到最新版能解决不少问题。还有个更省事的思路,先别急着上自定义工具,用官方examples里那个echo server试试,如果那个也断,那就是环境或配置问题,如果那个稳定,再对照着改你的代码。端口和防火墙基本不用管,MCP本地走的是标准输入输出,不是socket,除非你特意配了SSE传输。最后提醒下,Cursor设置里那个MCP server的启动命令最好用绝对路径,python环境也别用系统默认的,有时候虚拟环境激活状态不一致会让子进程起来就崩。
我之前也踩过这坑,transport closed多半不是网络问题,是stdio通信超时了。你检查下工具执行时间是不是超过默认的60秒了?把server端那句asyncio.sleep去掉试试。另外Cursor的MCP客户端对本地进程的stderr输出特别敏感,别在代码里print调试信息,得用logging写到文件里。
我也遇到过,多半是异步里没等response就断开,建议先跑通官方示例再改。
我也踩过这坑,transport closed多半是stdout被你的调试print污染了,MCP走stdio时任何多余输出都会让协议解析崩掉。先把所有print换成写日志文件,再确认server是长驻进程而不是跑完就退。另外Cursor那边记得手动设一下command和args,路径别用相对路径,我之前就是cwd不对导致进程秒退。可以先用mcp的inspector单独测server,能稳定跑通再接Cursor,这样排查快很多。
我前段时间也踩过这个坑,Cursor里MCP断联大概率不是防火墙的锅,而是你的工具函数执行时间太长把stdio传输给卡死了。MCP默认走的是标准输入输出,Cursor那边对单次调用的响应超时其实挺短的,你跑几秒钟不返回它就认为transport挂了,直接断给你看。你可以先试试把工具逻辑简化成秒回,看还断不断,如果不断就说明是超时问题。另外异步那块也要注意,别在handler里用同步阻塞的IO,文件搜索尤其容易踩,建议全换成async或者丢到线程池里跑。还有个隐蔽的点是往stdout里打日志,MCP协议本身就在用stdout通信,你随便print一下就可能把消息流搞乱,日志一定要走stderr。真要我推荐个稳定姿势的话,先拿官方那个everything示例server跑通,确认环境没问题再改自己的代码,比对着文档硬啃快多了。