最近刚上手MCP,想用Cursor搭个本地服务器试水,结果折腾了两天。我参照官方文档装好Python SDK,写好了一个简单的文件搜索工具,启动后Cursor倒是能发现这个server,但每次调用工具跑几秒钟就提示连接中断,报错“transport closed”。我试过换端口、关防火墙,甚至还重启了电脑,问题依旧。是不是MCP的传输协议对本地socket有什么特殊要求?还是我代码里异步处理写错了?感觉网上资料太零散了,求大佬指点一个稳定的入门配置。
MCP服务器连Cursor老是断联,是我姿势不对吗?
全部回复
共 148 条八成是keepalive没配,本地socket空闲几秒就被清了,试下把ping间隔调短点。
我之前也踩过这个坑,多半不是协议问题,而是Cursor对MCP的stdio连接超时设置太短,长任务跑一会儿就杀进程了。你可以试试把工具逻辑改成先返回一个任务ID,再通过另一个接口轮询结果,别让调用阻塞太久。另外检查下Python SDK版本,我记得0.9.x有个已知的keepalive bug,升到最新版会稳很多。还有,如果用的是Windows,确认下服务端有没有开子进程清理,有时句柄泄漏也会触发transport closed。
我之前也踩过这个坑,而且比你更惨,折腾了三天才反应过来。最可能的问题不是防火墙或者端口,而是你那个文件搜索工具里用了同步阻塞操作,MCP的stdio传输对事件循环特别敏感,一旦有耗时调用卡住心跳,Cursor那边就会判定transport closed。我当时是把工具函数改成了async,然后所有文件读取都扔给asyncio.to_thread去跑,就没再断过。另外检查一下你的SDK版本,老版本对子进程的信号处理有bug,升级到最新版能解决很多玄学断连。还有个小细节,如果你在Windows上跑,记得把控制台代码页改成UTF-8,不然日志输出带特殊字符也会干扰连接。至于网上资料,确实碎片化严重,建议直接去翻官方SDK仓库里的examples目录,比任何教程都靠谱。如果你试完还是断,可以试试用JSON-RPC模式手动发请求调试,看是不是你的工具返回了非序列化的对象。
八成是本地socket的keepalive没配,SDK默认的超时时间太短,试试把心跳间隔调大点。
之前折腾MCP也遇到过transport closed,多半不是姿势问题,而是stdio超时设置太短了。你试试在server启动时把session的idle timeout调大点,比如60秒,另外确认下代码里有没有阻塞事件循环的地方,异步函数里别用同步IO。还有个小坑,Cursor的MCP客户端对stderr输出很敏感,别在server里print日志到标准错误,容易误判断连。
我之前也遇到过类似问题,后来换了方案。
八成是stdio的通信超时设置太短,试试把启动命令改成绝对路径加长超时参数,我上次这么弄就好了。
八成是stdio传输超时的问题,试试把超时时间调大或者改用sse模式,我当初也卡这好久。
我前两天也踩过这个坑,后来发现多半是异步任务没挂住事件循环,MCP的stdio传输对进程生命周期要求很严。你试试在工具函数里别用普通异步生成器,改成显式返回结果,或者加个asyncio.sleep(0)让出控制权。另外检查下Cursor那边的超时设置,有时候默认的10秒不够用,文件搜索如果路径大了很容易卡断。
这问题我上周刚踩过,八成不是你代码的锅。Cursor对MCP的stdio传输超时设置特别短,本地工具一旦处理稍慢或者日志输出太多,它就直接掐断。你试试在启动命令里加个--log-level ERROR,把输出压到最小,另外把server端的超时时间手动调大点。如果还断,换成SSE模式走HTTP端口,稳定性会好很多,我换了之后基本没再掉过。
八成是MCP的stdio通道在Cursor里生命周期太短,试试把server改成sse模式挂后台跑。
我之前也卡在这玩意儿上好久,后来发现多半是MCP那个stdio传输跟Cursor的进程生命周期没对齐,尤其是你自己写的异步循环,跑完一次任务后event loop别关。你试试把server端改成用sse模式,或者直接把超时时间调长点,有时候默认几秒的keepalive不够用。另外检查下是不是Python版本太新,有些SDK在3.12上会有奇怪的socket行为。
我之前也踩过这个坑,后来发现多半是MCP那个stdio传输方式在Cursor里对超时特别敏感,工具执行超过几秒就给你掐了。你可以试试把工具改成异步非阻塞,或者干脆用streamable HTTP模式替代本地socket,稳定性会好很多。另外检查下Python SDK版本,新版对连接保活修了不少bug,老版本确实容易出transport closed。
我之前也遇到过一模一样的情况,后来发现是MCP默认的stdio传输在Cursor里容易超时,尤其是工具执行时间稍长一点就会断。你可以试试把server改成用SSE模式跑在HTTP上,然后连接地址填那个URL,稳定性会好很多,官方文档里其实有这部分的例子但藏得比较深。另外如果用的是asyncio,记得确保事件循环里没有阻塞调用,否则也会造成transport closed。
大概率是MCP的stdio传输超时设置太短,你可以试试在server启动命令里加个--timeout参数,或者改用SSE模式。
八成是MCP的stdio传输跟Cursor的进程生命周期没配对,试试把server改成sse模式挂后台跑。
这问题我上个月也踩过,八成不是协议问题,是Cursor那边对MCP的stdin/stdout通道有超时限制。你试试把server改成用sse模式跑,或者检查下是不是代码里logging打到stdout把通信挤爆了。还有个坑是Python SDK版本要跟Cursor的MCP客户端匹配,太新太旧都会莫名断。
这报错八成是MCP的stdio传输和Cursor的握手周期不匹配,试试把server改成sse模式或者加个心跳保活。
我之前也踩过这个坑,多半不是协议问题,而是MCP server端没做心跳保活,Cursor那边空闲几秒就主动掐断了。你试试在工具调用循环里加个简单的ping或者日志输出,让连接一直有活动。另外检查下Python SDK版本,有些老版本对asyncio事件循环处理有bug,升级到最新版能解决不少玄学断连。我后来换成了stdio传输方式,比socket稳得多,配置也简单,你可以优先试这个。
我之前也踩过这个坑,多半不是姿势问题,是MCP的stdio传输在Cursor里对子进程生命周期管理特别敏感。你试试把server启动方式从本地进程改成SSE模式,或者给工具调用加个超时重连逻辑,我这么改完基本没断过。另外检查下Python SDK版本,有个老版本在异步任务没结束时就会提前关闭transport,升级到最新版能解决大半问题。