折腾了两天,快破防了。我在本地用Python写了一个简单的MCP服务器(就一个get_weather工具),用mcp.run(transport="stdio")启动,然后在Cursor的MCP配置里填了python /path/to/server.py。配置文件里能看到服务器状态是connected,但工具列表一直是空的,怎么刷新都没用。我试过用官方的@mcp.tool()装饰器,也试过直接暴露函数,都不行。看日志也没报错,就是加载不出来。是不是Cursor对MCP的协议版本有要求?还是我少配了name和version字段?有没有老哥用MCP踩过类似的坑,求指点一下排查思路。
MCP服务器接入Cursor后工具列表是空的,有人遇到过吗?
全部回复
共 63 条之前折腾过类似的,连上了但工具不显示大概率是协议版本或者初始化握手的问题。你试试在server.py里显式加个name和version字段,有些客户端对这两个字段校验很严格,缺了就直接忽略工具列表。另外可以先用mcp dev或者直接npx @modelcontextprotocol/inspector跑一下你的服务器,看看返回的tools数组是不是空的,如果inspector里能正常显示但Cursor不行,那就是Cursor这边兼容性的锅,换个版本或者用Claude Desktop验证下。
我之前也卡在这过,后来发现大概率不是协议版本的问题,而是MCP的初始化握手没完成。你试试在服务端启动后手动打印一下stderr输出,很多时候工具列表为空是因为server在等client发initialize请求,但stdio模式下某些环境变量没传对,导致连接挂着但没真正握手。另外,Cursor对MCP的发现机制是拉取tools/list,如果你没显式声明server的name和version,某些版本会直接跳过该server的资源加载,虽然状态显示connected。我之前是加了个@mcp.server()实例化时传了name和version字段,再把工具函数用@server.tool()注册,而不是用全局@mcp.tool(),才解决的。还有个坑是如果你用了Python 3.12+,某些asyncio事件循环和Cursor内置的Node通信会有兼容问题,试着降级到3.10或者用mcp.run(transport="stdio", init_options=...)显式传参。最后建议你装个mcp-inspector单独测一下你的server,如果inspector里能看到工具,那就是Cursor端缓存或者配置路径识别的问题,清一下~/.cursor的缓存再重启试试。
我之前用Claude Desktop也遇到过类似的,后来发现是stdio模式下必须等进程完全退出再重连,Cursor这边配置完最好整个重启一下,光刷新不行。另外你检查下MCP server的日志输出有没有被Cursor吞掉,有时候错误会直接打到stderr里,建议先单独跑一遍确认能正常返回tools/list。协议版本的话,目前Cursor好像只支持2024-11-05那版,太新或太旧都会静默失败,你可以在配置里显式指定一下试试。
我之前也卡在这过,后来发现是MCP server的初始化返回格式不对,Cursor对tools的schema要求很严格,少了个inputSchema字段就直接不显示。你可以先单独跑一下server,用mcp dev或者直接发个initialize请求看看返回的tools数组里有没有内容,别光看连接状态。另外确认下你的Python环境是不是和Cursor调用的那个一致,有时候虚拟环境没对上也会静默失败。
之前用Claude Desktop连MCP也遇到过类似的,后来发现是Python环境变量的问题,Cursor那边用的解释器和系统默认的可能不是同一个,你试试在配置里写绝对路径指向虚拟环境里的python。另外检查一下MCP协议版本,我记得Cursor现在只支持2024-11-05那个版本,太新或太旧都会出现连上但没工具的情况。还有个笨办法,先跑个mcp dev看看控制台有没有输出,有时候工具加载失败是因为装饰器没被正确识别,函数定义要在if __name__ == "__main__"之前。
大概率是stdio传输时没加--transport参数,试试在配置里显式指定python /path/to/server.py --transport stdio。
八成是协议版本不匹配,Cursor只认特定MCP版本,试着在server里显式声明下版本试试。
我之前也卡这,后来发现是stdio传输格式少了换行符,你检查下是不是这块的问题。
大概率是Cursor只认initialize响应里的协议版本,你试试在server里显式声明protocolVersion=2024-11-05。
我之前折腾MCP的时候也碰到过一模一样的情况,后来发现是协议版本不匹配的问题。Cursor目前对MCP的兼容性还是有点挑,特别是stdio模式下,它要求server端必须严格实现initialize握手,而且tools/list的响应格式里不能有多余字段。你那个mcp.run(transport="stdio")如果是用的最新版Python SDK,默认走的可能是MCP的2024-11-05协议,但Cursor有些版本还停留在更早的协议上,这就导致连接成功但工具列表解析不出来。你可以试试在server代码里显式指定协议版本,或者在Cursor的配置里加一个--protocol-version参数强制对齐。另外,name和version字段确实得有,但更关键的是你那个get_weather工具有没有定义inputSchema,如果只用@mcp.tool()装饰器而没给参数加类型注解或JSON Schema,Cursor可能也会当成无效工具忽略掉。我之前就是漏了给函数参数加str类型提示,结果列表也是空的,加上之后立刻就好了。还有个小坑,Cursor的MCP配置里路径最好用绝对路径,并且不要带~这种符号,有时候shell解析会出问题,导致进程起来了但通信异常。你先用mcp dev跑一下看看能不能在调试界面里看到工具,如果能看到就说明server没问题,问题肯定出在Cursor的配置解析上。
试试在server.py里显式加server.name和server.version,之前我也这样,补上就出来了。
试试在启动命令前加--transport stdio显式指定,或者检查下Python环境是不是用了虚拟目录导致路径对不上。
我之前也碰到过一模一样的情况,折腾半天后来发现是Python环境的问题。Cursor那边默认调用的可能是它自带的Python解释器,跟你终端里用的不是同一个,导致MCP服务器虽然连上了但模块加载失败。你可以试试在配置里写死绝对路径,比如直接用conda或venv里那个python的完整路径,或者先写个简单的log文件确认一下服务器进程到底跑没跑起来。
另外检查下MCP协议版本,Cursor目前对2024-11-05那版支持得比较好,如果你用的SDK默认是2025年的新版协议,可能就有兼容问题,可以在初始化Server时显式指定版本。还有个比较隐蔽的坑是stdio传输时输出不能有print,不然会污染协议通信,我之前就是调试时加了个print导致工具列表一直空。
实在不行的话,换个思路用sse模式试试,虽然配置麻烦点但至少能看到请求日志,排查起来会直观很多。
我之前也卡在这过,后来发现是Python环境的问题,Cursor那边默认用的解释器跟你终端里跑的不一定是同一个,你试试在MCP配置里写全python的绝对路径,或者直接用.venv/bin/python这种。另外协议版本倒是次要的,主要是stdio模式下工具列表拉取失败经常是日志没打全,建议在server.py里加个--debug或者把stderr重定向到文件看看有没有隐藏报错。还有个小坑,@mcp.tool()装饰器得确保函数是同步的,异步的话某些版本会直接静默失败,你可以先换回同步试试。
我之前也踩过这个坑,后来发现是Python环境的问题。Cursor调MCP时用的是它自己的解释器路径,如果python指向的是conda或虚拟环境,stdio通信虽然能连上但工具注册可能失败,试试在配置里写绝对路径,比如/usr/bin/python3 /path/to/server.py。
另外检查下MCP server的日志输出,Cursor对stderr里的警告很敏感,有时候工具其实注册成功了但被协议握手时的多余输出干扰了。我之前就是打印了个调试信息导致列表空白。
版本方面,Cursor现在要求MCP协议至少0.1.0,如果你用的是最新版mcp库,可能默认走的是新协议,但Cursor还没完全兼容。可以试试把mcp降到0.9.x,或者用mcp.run(transport="stdio", protocol_version="2024-11-05")强制指定旧版本。
实在不行,用npx @modelcontextprotocol/server-everything先跑个官方测试服务器,如果那个能显示工具,就说明是你自己代码的问题,再逐行排查。别灰心,这玩意儿配置起来就是玄学。
我之前也卡在这过,后来发现是Cursor的MCP配置里必须显式写清command和args,不能只塞一个完整命令进去,不然工具列表就是空的。另外检查下Python环境,有时候它用的是全局解释器,跟你跑server.py那个环境不是同一个,依赖没装上也会静默失败。你试试在终端手动跑一下mcp的协议握手,看返回的initialize响应里有没有tools字段,能直接看出问题。版本字段倒不是必须的,但加上name和version更稳,我补上之后就好了。
大概率是Cursor只认sse传输,stdio的配置得用绝对路径加--port参数,或者检查下MCP版本是不是要>=1.0。
我之前也卡在这过,后来发现是Cursor的MCP客户端对stdio模式下的初始化握手特别严格,你的server.py里如果没显式处理initialize请求并返回协议版本,光靠mcp.run有时候会静默失败。你试试在代码里加个@mcp.list_tools()之类的显式声明,或者干脆用--transport sse先跑起来看工具能不能出来,这样能快速定位是不是协议版本不匹配的问题。另外检查下Python环境,别让Cursor用了它自带的解释器而不是你装mcp库的那个。
遇到过,多半不是协议版本的问题,而是stdio握手时没把初始化响应里的capabilities发全。Cursor对tools/list的解析比较严格,你试试在server里显式声明一下server info,或者把transport换成sse模式debug看看原始输出。另外检查下Python环境是不是用了venv,路径写绝对地址别用相对路径,有时候python指向的不对也会静默失败。
我之前也遇到过一模一样的坑,后来发现是Cursor对MCP的协议版本卡得比较死,尤其是Python SDK版本太新或太旧都会导致工具列表空白。你试试把mcp库降到0.9.0左右,或者干脆用npx方式启动一个官方示例对比下,先确认是不是环境问题。另外检查下server.py有没有加if name == 'main'的保护,stdio模式下这个挺容易忽略的。配置里能显示connected但工具为空,大概率是初始化握手时response格式不对,你可以在本地用mcp-inspector单独测一下,比在Cursor里debug直观多了。
大概率是stdio模式下没加--transport参数或协议版本不匹配,试试换sse传输方式。