最近在玩Cursor的Agent模式,想着把MCP服务接上去试试,结果折腾了两天……服务端用的是FastMCP的Python SDK,本地跑没问题,但通过Cursor的MCP配置连上后,Agent一调用工具就报“connection closed”或超时。我试过改transport为stdio和sse,也检查了端口没冲突,日志里看不出明显错误。网上搜了一圈,有人说要加心跳包,有人说Cursor的MCP实现还不稳定。有没有大佬遇到过类似情况?还是说MCP和Cursor的版本匹配有问题?我用的Cursor 0.45.x,MCP SDK 1.2.0。求指点,感谢!
MCP对接Cursor后,Agent总是调用失败,是我配置姿势不对吗?
全部回复
共 174 条大概率是Cursor对SSE的支持有坑,试试把transport换成streamable-http,新版SDK都推这个。
说实话你这套组合我上个月也踩过类似的坑,最后发现大概率不是配置姿势的问题,而是Cursor侧对MCP长连接的管理太粗暴了。FastMCP默认的stdio模式在Agent每次工具调用后,如果进程没完全退出,Cursor就会判定连接异常,我后来强制在服务端加了asyncio的task超时清理才稳定点。你试试把transport换成sse后,确认下服务端是不是真的在推事件流,Cursor的sse实现其实对heartbeat间隔特别敏感,默认的15秒可能刚好卡在它的超时边界上。另外0.45.x这个版本我记得对MCP的tool schema校验有bug,特别是参数里带optional字段时容易直接断连,建议先降级到0.43.x或者升级到最新0.46+看看。日志没报错不代表没问题,我建议你开DEBUG级别抓一下Cursor自己进程的网络输出,有时候错误被吞在它的内部worker里了。版本匹配的话,MCP SDK 1.2.0跟Cursor 0.45确实有已知的协议兼容问题,官方issue里有人提过,主要是initialize请求里的protocolVersion协商不一致。你不如换个思路,先本地写个最小demo只暴露一个无参数工具,排除是工具定义太复杂导致的序列化问题,一步步加复杂度。
我之前也踩过这个坑,后来发现是Cursor那边对stdio的启动命令解析有点问题,路径里带空格或者用了虚拟环境的相对路径就容易连不上。你试试把Python解释器和脚本都写成绝对路径,命令参数拆开单独填,别一股脑塞一行里。另外SDK 1.2.0跟0.45.x的Cursor确实有过兼容问题,可以降到1.1.x或者升级Cursor试试,我升到0.46后stdio就稳多了。
我上周也这样,把MCP SDK降到1.0.0就通了,版本兼容确实有坑。
我之前也踩过这个坑,Cursor 0.45.x 对MCP的SSE支持确实有点拉胯,stdio反而更稳一点。你试试把FastMCP的启动命令写成绝对路径,别用相对路径,Cursor有时候工作目录不对就静默挂了。另外SDK 1.2.0和这个版本的Cursor好像有个握手超时的小bug,降级到1.1.x会好很多。日志的话建议开MCP的debug模式看下stderr,光看Cursor那边基本看不出啥。
Cursor 0.45 的 MCP 确实有点抽风,我升到 0.46 后 stdio 就稳了,你试试降级 SDK 到 1.1.x 看看。
我之前也踩过差不多的坑,后来发现是Cursor那边对stdio模式下的进程启动路径挺敏感的,稍微有点环境变量差异就会静默断连。你可以在MCP配置里把command写成绝对路径,再手动加上cwd参数试试看。另外1.2.0的SDK跟0.45.x确实有几个已知的兼容问题,升级到最新版可能会好点。
试试把SDK降到1.0.x,1.2跟0.45的Cursor确实有兼容坑,我上周也踩过。
我之前也踩过这个坑,Cursor 0.45.x 对 SSE 的支持确实有点问题,换成 stdio 之后基本就稳了。另外你 FastMCP 那边如果工具函数里有阻塞操作,很容易触发超时,建议先拿个最简单的 echo 工具测通再往上加逻辑。SDK 1.2.0 和这个版本 Cursor 搭配应该没大毛病,重点看下启动命令的路径是不是绝对路径,相对路径经常连不上。
Cursor 0.45.x 对 MCP 的 sse 支持确实有点抽风,我换回 stdio 加个 keepalive 就稳了,你试试降级 SDK 到 1.1 看看?
这个坑我上个月刚踩过,折腾了差不多一周才摸清楚。你用的Cursor 0.45.x配MCP SDK 1.2.0,其实版本上有个比较隐蔽的坑,SDK从1.1之后对stdio的握手协议做了一些调整,而Cursor那边对响应超时的默认值卡得很死,稍微慢一点就直接给你connection closed,日志还什么都不报。我当时也是本地跑得好好的,一接Cursor就废。
后来我的解法是把服务端的启动逻辑简化,别在初始化阶段做任何耗时操作,比如读配置、连数据库这些统统挪到第一次工具调用时再懒加载,这样握手能秒回。另外stdio模式下Cursor对子进程的生命周期管得挺严,如果你服务里有后台线程没正确退出,它也会掐掉连接。
心跳包的说法我也看到过,不过实测在stdio下意义不大,那更多是sse场景的问题。你可以先试试加个简单的ping工具暴露出来,手动在Agent里调一下,看看到底是连不上还是调不通,能排除掉一半可能。真不行就退回SDK 1.0.x看看,有时候新版本反而不省心。
我之前也踩过这个坑,最后发现是FastMCP那边stdio模式下日志输出到stdout导致的,Cursor会把非协议内容当脏数据直接断连。你可以试试把日志重定向到stderr或者写文件,别让它污染标准输出。另外1.2.0的SDK跟0.45.x的Cursor确实有点版本摩擦,我换回1.0.x之后就稳了,你可以先降级验证一下。
我之前也踩过这个坑,问题大概率出在Cursor对stdio模式下的进程管理上,它有时候会把子进程直接干掉导致connection closed。你可以试试把MCP服务单独跑起来用sse模式连,然后在Cursor配置里显式写上url而不是让它自己拉起进程。另外SDK 1.2.0跟0.45.x确实有点兼容问题,我升到1.3.0之后稳定多了,建议先换版本试试。
我之前也踩过这个坑,后来发现是Cursor对stdio模式的超时卡得特别死,稍微慢一点就直接断连。你可以试试在FastMCP那边把工具响应的日志级别调低,或者干脆先写个最简单的echo工具测通路,排除是不是某个具体工具卡住了。另外SDK 1.2.0跟Cursor 0.45确实有过兼容问题,我升到1.2.1之后稳定不少,值得一试。