Cursor 本地 MCP 报 No server info,stdio 进程到底起没起来

本地 MCP 配进 Cursor 之后面板红点、工具列表空,Output → MCP Logs 里常出现 No server info found。这句报错一般只是结果:Cursor 已经打算做 ListOfferings,手里却没有一份可用的 server 会话信息。本地 stdio 场景里,前面通常已经有 Starting new stdio process with command: …,紧接着 Client closed for command,再跟 MCP error -32000: Connection closed 或 -32001: Request timed out,最后才打出 No server info found。网上帖子和仓库 issue 里经常能看到这一串日志。

官方文档(Model Context Protocol (MCP) | Cursor Docs)把本地服务器归到 stdio 传输:Cursor 按 mcp.json 起一个进程,走标准输入输出做 JSON-RPC。配置位置有两处:项目级 .cursor/mcp.json,全局 ~/.cursor/mcp.json。stdio 字段:type(文档表写作必填,示例值 "stdio")、command(必填,须在 PATH 上或写绝对路径)、args、env、envFile(仅 stdio 支持;远程 HTTP/SSE 不用 envFile)。密钥用环境变量传入;插值支持 ${env:NAME}、${userHome}、${workspaceFolder} 等,作用在 command / args / env / url / headers。排查方法官方 FAQ 里写了:打开 Output(macOS 一般是 Cmd+Shift+U,Windows 常用 Ctrl+Shift+U),下拉选 MCP Logs,看初始化、鉴权和崩溃信息。

先从日志里找出真正的错误。面板红字往往只说连不上;真正原因在「Client closed」上一两行,或者根本没进 MCP Logs,早期版本对子进程 stderr 转发不完整,社区文章也提到这一点,所以稳妥做法是把 mcp.json 里的 command 和 args 原样抄到系统终端再跑一遍。包版本不存在(npm ETARGET)、缺依赖、脚本一启动就 exit,终端里立刻能看见;Cursor 面板上只会显示 Client closed → No server info found。

command / PATH。文档要求 command「在系统 path 上可用,或写全路径」。从 Dock / 开始菜单拉起的 Cursor,环境不一定等于你日常用的交互 shell:nvm、fnm、asdf 装的 node/npx,在终端里有,在 GUI 进程里可能 ENOENT。可以这样查:终端里 which npx / where npx,把得到的绝对路径写进 command,或先全局装好包再指向那个可执行文件。Windows 上 npx 实际是 npx.cmd,不少人直接写 "command": "npx" 会 spawn 失败;社区常见写法是 "command": "cmd",args 里放 "/c", "npx", "-y", "包名…"(或 C:\Windows\System32\cmd.exe)。这是社区里验证比较多的 workaround,官方字段表里没有,用之前还是建议在 cmd.exe 里先跑通同一串命令。

args 写错同样会让进程秒退:漏 -y、包名/版本拼错、把本该拆开的参数粘成一项、路径含空格却没按 JSON 数组拆开。官方 Node 示例是 "command": "npx", "args": ["-y", "mcp-server"];Python 示例是 "command": "python", "args": ["mcp-server.py"]。改完配置后,文档更新 npm 包的步骤是:从 Customize 里移除 → npm cache clean --force → 再加回;自定义脚本则改本地文件后重启 Cursor。

环境变量。stdio 可用 env 内联,或 envFile 指向 .env / ${workspaceFolder}/.env。${env:API_KEY} 取的是 Cursor 进程能见到的环境;只写在某个终端 profile、却从图形界面启动编辑器时,插值可能是空的,服务器因缺 Key 直接退出,日志里看到的还是 Client closed / No server info。把 Key 放进 mcp.json 的 env,或保证变量在系统/用户环境里对 GUI 可见,再对照 MCP Logs。官方也提醒:密钥走环境变量,不要硬编码进仓库。

协议层面还有一类:stdio 上 stdout 只能走 JSON-RPC,调试日志应打 stderr;往 stdout 打 banner/进度条会打乱握手。自定义 server 若在终端手动管道测试能回 initialize,Cursor 里仍立刻 No server info found,有人报过生命周期/时序问题(包括 macOS),也有人用 Docker 包一层绕过。这类更像是客户端或实现上的问题,不是改一行配置就能解决的。能做的是先确认自己的 server 在纯终端下能完成 initialize,再对比 Cursor 日志。

企业环境另有 MCP Allowlist / 网络沙箱:stdio 可按 command 模式放行,网络模式有 Allow all / Allowlist / Deny all / No sandbox。个人机很少碰到;公司机若 command 根本起不来,先问管理员是否在名单外。

建议顺序:MCP Logs 看清关闭前那一行 → 终端复现同一 command+args → 修 PATH/绝对路径(Windows 再试 cmd /c)→ 核对 env / envFile → 清 npm 缓存后重加 → 完整退出再开 Cursor。来路不明的一键 MCP 合集、预装 mcp.json 最好别用。

官方文档:

  • MCP 文档:https://cursor.com/docs/mcp
  • 同页 FAQ「How do I debug MCP server issues?」(Output → MCP Logs)
  • 配置位置与 stdio 字段表:同文档 Using mcp.json / STDIO server configuration