1. Mac 上 Cursor 插件市场空白、安装转圈的真实原因
你在 Mac 上打开 Cursor,点左侧扩展图标,搜索框输入插件名,结果列表一直转圈,或者干脆一片空白;点「安装」按钮,进度条卡在 0% 不动,过一会儿弹出一个红字报错。这不是你的网络问题,也不是 Cursor 坏了,而是 Cursor 内置的扩展市场地址(extensionsGallery)指向的接口失效了。
Cursor 本质上是基于 VS Code 开源版本二次开发的编辑器,它的插件体系完全沿用 VS Code 的扩展市场协议。VS Code 的扩展市场由微软运营,接口地址写在应用包内的product.json文件里。近期微软调整了非官方客户端的访问鉴权策略,导致 Cursor 默认配置里的extensionsGallery地址无法正常返回插件列表。表现就是:搜索无结果、安装转圈、已安装插件无法更新。
这个问题在 Mac 上尤其明显,因为 Mac 的应用包结构是.app目录形式,product.json藏在/Applications/Cursor.app/Contents/Resources/app/下面,不像 Windows 那样直观。很多人第一次遇到会以为是网络被墙,反复切换网络、重启路由器,其实方向完全错了。
解决思路很直接:把product.json里的extensionsGallery字段替换成一个可用的扩展市场地址,让 Cursor 能正常拉取插件元数据和下载包。改完之后重启 Cursor,插件市场就能恢复。下面我会给出完整的定位路径、可复制的配置片段、修改前后的对比,以及改完之后如何用 TaoToken 的统一 Key 通道做一次连通性自检,确保你的 API 调用和插件源都正常。
适合谁看:Mac 上使用 Cursor 的开发者、刚装完 Cursor 发现插件装不上的新手、以及想搞清楚 Cursor 插件机制顺便把 API 通道也理顺的人。整个操作不需要重装 Cursor,不需要卸载插件,改一个 JSON 字段加重启就行。
2. 定位 product.json 并理解 extensionsGallery 字段结构
2.1 用终端直接跳转到 Cursor 应用资源目录
Mac 上 Cursor 的应用包路径是固定的。打开终端(Terminal),执行下面这行命令,Finder 会直接弹出 Cursor 的资源目录:
open /Applications/Cursor.app/Contents/Resources/app/如果你把 Cursor 装在了其他位置,比如~/Applications/,把路径换成对应的即可。执行后你会看到一个 Finder 窗口,里面有一堆文件和文件夹,其中就有product.json。
注意:不要直接双击打开
product.json编辑,因为系统默认可能用文本编辑打开,保存时容易带入格式问题。建议用 VS Code 或 Cursor 自身打开,或者用终端里的nano、vim。
2.2 product.json 里 extensionsGallery 的原始结构
用编辑器打开product.json,搜索extensionsGallery,你会看到类似这样的结构:
"extensionsGallery": { "serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery", "cacheUrl": "https://vscode.blob.core.windows.net/gallery/index", "itemUrl": "https://marketplace.visualstudio.com/items" }这是 Cursor 默认指向微软官方市场的配置。问题出在serviceUrl和itemUrl这两个地址上——微软对非 VS Code 客户端的请求做了限制,返回 401 或空结果。cacheUrl指向的 blob 存储也可能因为鉴权问题无法访问。
你需要把整个extensionsGallery对象替换成一套可用的配置。注意,不同版本的 Cursor,product.json里这个字段的键名可能略有差异,有的版本有galleryId、resourceUrlTemplate、controlUrl等额外字段。替换时以你文件里实际存在的结构为准,把值改掉即可。
2.3 修改前后的对比
修改前(默认,失效):
"extensionsGallery": { "serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery", "cacheUrl": "https://vscode.blob.core.windows.net/gallery/index", "itemUrl": "https://marketplace.visualstudio.com/items" }修改后(可用):
"extensionsGallery": { "galleryId": "cursor", "serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery", "itemUrl": "https://marketplace.visualstudio.com/items", "resourceUrlTemplate": "https://marketplace.visualstudio.com/{publisher}/{name}/{version}/{path}", "controlUrl": "https://api2.cursor.sh/extensions-control", "extensionUrlTemplate": "https://www.vscode-unpkg.net/_gallery/{publisher}/{name}/latest", "recommendationsUrl": "", "nlsBaseUrl": "", "publisherUrl": "" }关键变化:增加了galleryId标识为 cursor,补上了resourceUrlTemplate和extensionUrlTemplate,让插件包的下载路径走vscode-unpkg.net这个镜像。controlUrl保持指向 Cursor 自己的控制接口。
提示:
product.json是 JSON 格式,不能有注释,不能有多余逗号。改完后建议用python3 -m json.tool product.json校验一下格式,避免因为一个逗号导致 Cursor 启动异常。
2.4 修改文件权限的坑
Mac 上/Applications/Cursor.app/目录默认属于系统管理,普通用户可能没有写权限。如果你保存时提示「没有权限」,有两种处理方式:
第一种,用终端加sudo编辑:
sudo nano /Applications/Cursor.app/Contents/Resources/app/product.json输入密码后编辑,Ctrl+O保存,Ctrl+X退出。
第二种,先改文件权限再编辑:
sudo chmod 666 /Applications/Cursor.app/Contents/Resources/app/product.json改完保存后,建议把权限改回去:
sudo chmod 644 /Applications/Cursor.app/Contents/Resources/app/product.json我试过直接改权限不还原,Cursor 后续自动更新时偶尔会报权限冲突,还原成 644 更稳妥。
3. 可复制的 product.json 配置片段与 TaoToken 通道对接
3.1 完整的 extensionsGallery 替换片段
把下面这段直接复制,替换你product.json里原有的extensionsGallery整个对象。注意保留外层的大括号和逗号结构,确保它和前后字段的 JSON 语法正确:
"extensionsGallery": { "galleryId": "cursor", "serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery", "itemUrl": "https://marketplace.visualstudio.com/items", "resourceUrlTemplate": "https://marketplace.visualstudio.com/{publisher}/{name}/{version}/{path}", "controlUrl": "https://api2.cursor.sh/extensions-control", "extensionUrlTemplate": "https://www.vscode-unpkg.net/_gallery/{publisher}/{name}/latest", "recommendationsUrl": "", "nlsBaseUrl": "", "publisherUrl": "" }替换完成后,用终端校验 JSON 合法性:
python3 -m json.tool /Applications/Cursor.app/Contents/Resources/app/product.json > /dev/null && echo "JSON OK"输出JSON OK说明格式没问题。如果报错,根据提示的行号回去检查逗号或引号。
3.2 插件源切换后的 API 通道配置
插件市场修好只是第一步。Cursor 的 AI 能力(对话、补全、Agent)依赖 API 通道。如果你用的是 TaoToken 的统一 Key 通道,需要在 Cursor 的设置里配置 Base URL 和 API Key。打开 Cursor 设置,搜索openai或直接进Settings > Models,填入:
{ "openai.baseUrl": "https://taotoken.net/api", "openai.apiKey": "你的TaoToken Key", "openai.model": "claude-sonnet-4-20250514" }如果你用的是 Cursor 的settings.json(通过Cmd+Shift+P输入Open Settings (JSON)打开),可以直接加:
{ "cursor.openai.baseUrl": "https://taotoken.net/api", "cursor.openai.apiKey": "sk-你的Key", "cursor.openai.model": "claude-sonnet-4-20250514" }注意:Base URL 填
https://taotoken.net/api,不要加多余的路径后缀。Key 在 TaoToken 控制台的 API Keys 页面生成,格式通常是sk-开头。
3.3 三件套对照表
无论你用 Cursor、Cline 还是 Claude Code,接入任何兼容 OpenAI 协议的工具都需要三件套:Base URL、API Key、Model ID。对照如下:
| 配置项 | 值 | 说明 |
|---|---|---|
| Base URL | https://taotoken.net/api | 统一 API 入口,不加 UTM |
| API Key | sk-xxxxxx | 在控制台 API Keys 页面生成 |
| Model ID | claude-sonnet-4-20250514 | 按需换成其他可用模型 |
如果你用的是 Claude Code 的settings.json或 Codex 的auth.json,配置逻辑一样,只是文件路径和键名不同。Claude Code 在~/.claude/settings.json里配env字段,Codex 在~/.codex/auth.json里配OPENAI_API_KEY和OPENAI_BASE_URL。
3.4 为什么插件源和 API 通道要一起检查
很多人改完product.json重启 Cursor,发现插件能搜到了,但 AI 对话还是报错。这是因为插件市场和 AI API 是两条独立的通道。插件市场走extensionsGallery里的地址,AI 能力走你配置的 Base URL。两条都通,Cursor 才算完全可用。
改完product.json后,建议顺手把 API 通道也配好,然后用下一节的验证步骤一次性确认两条通道都正常。
4. 重启 Cursor 并验证插件安装与 API 连通性
4.1 完全退出 Cursor 的正确方式
改完product.json后,不能只是关窗口,必须完全退出进程。Mac 上右键点击 Dock 栏的 Cursor 图标,选择「退出」。或者用终端强制退出:
osascript -e 'quit app "Cursor"'等几秒确认进程结束:
pgrep -x Cursor如果没有输出,说明进程已退出。然后重新双击应用图标启动。
4.2 验证插件市场恢复
启动后,点左侧扩展图标,搜索一个常见插件,比如Python或Prettier。正常情况下,列表会在 1-2 秒内返回结果,点「安装」按钮,进度条会走完并提示已安装。
如果搜索还是空白,打开 Cursor 的命令面板(Cmd+Shift+P),输入Developer: Open Extension Logs Folder,查看日志里有没有extensionsGallery相关的报错。常见的是ETIMEDOUT或401,说明地址没替换成功或者 JSON 格式有问题。
4.3 用 curl 验证 API 通道连通性
在终端里执行下面这条命令,验证 TaoToken 的 API 通道是否可达:
curl -s -o /dev/null -w "%{http_code}" https://taotoken.net/api/v1/models \ -H "Authorization: Bearer sk-你的Key"返回200说明 Key 和 Base URL 都正确。返回401说明 Key 无效或没带上。返回000说明网络层不通,检查你的网络环境。
4.4 在 Cursor 里发一条测试对话
打开 Cursor 的 Chat 面板(Cmd+L),输入「你好,请回复 OK」。如果配置正确,模型会正常返回。如果报错reading choices或local proxy failed,说明 Base URL 或 Key 有问题,回到第 3 节检查配置。
提示:Cursor 有时会缓存旧的 API 配置,改完
settings.json后建议重启一次 Cursor,确保新配置生效。
4.5 成功结果对照
| 检查项 | 成功表现 | 失败表现 |
|---|---|---|
| 插件搜索 | 1-2 秒返回列表 | 一直转圈或空白 |
| 插件安装 | 进度条走完,提示已安装 | 卡 0% 或报错 |
| API 连通 | curl 返回 200 | 返回 401 或 000 |
| Chat 对话 | 正常返回内容 | 报 reading choices 错误 |
四项都通过,说明插件源和 API 通道都正常,Cursor 可以正常使用了。
5. 本篇常见报错排查:401、local proxy failed、reading choices、OAuth
5.1 401 Unauthorized
报错原文:Request failed with status code 401或Unauthorized。
原因:API Key 无效、过期,或者请求头里没带Authorization。在 Cursor 里检查settings.json的cursor.openai.apiKey字段,确认 Key 是完整的sk-开头字符串,没有多余空格。用 curl 单独测一次:
curl -s https://taotoken.net/api/v1/models \ -H "Authorization: Bearer sk-你的Key" | head -c 200如果 curl 也返回 401,去 TaoToken 控制台重新生成一个 Key。如果 curl 正常但 Cursor 报 401,说明 Cursor 没读到你的配置,检查settings.json的路径和键名是否正确。
5.2 local proxy failed
报错原文:local proxy failed或connect ECONNREFUSED 127.0.0.1:xxxx。
原因:Cursor 内部有一个本地代理层,用于转发 API 请求。如果 Base URL 配置成了localhost或某个本地端口,而本地没有对应的服务在跑,就会报这个错。检查你的cursor.openai.baseUrl是不是被误设成了http://127.0.0.1:8080之类的地址。正确值应该是https://taotoken.net/api。
还有一种情况:你之前配过某个本地代理工具,卸载后配置残留。打开settings.json搜索proxy,把http.proxy和cursor.openai.baseUrl都清理干净,只保留 TaoToken 的地址。
5.3 reading choices 报错
报错原文:Cannot read properties of undefined (reading 'choices')。
原因:API 返回的 JSON 结构不符合 OpenAI 协议,Cursor 解析choices字段时拿到 undefined。常见于 Base URL 填错,比如填成了https://taotoken.net/api/v1/chat/completions这种完整路径,导致请求发到了错误的端点。正确做法是 Base URL 只填到/api,让 Cursor 自己拼接/v1/chat/completions。
检查你的配置:
{ "cursor.openai.baseUrl": "https://taotoken.net/api" }不要加/v1,不要加/chat/completions。改完重启 Cursor。
5.4 OAuth 相关报错
报错原文:OAuth token expired或Failed to refresh token。
原因:Cursor 的账号登录态过期,或者你同时用了 Cursor 自带账号和第三方 API Key,两者冲突。处理方式:先在 Cursor 里退出登录(Cmd+Shift+P输入Sign Out),然后重新用 API Key 模式配置。如果你不需要 Cursor 的账号功能,可以在设置里关闭cursor.auth.enabled,纯用 API Key 驱动。
注意:OAuth 报错和插件市场无关,是账号体系的问题。改
product.json不会影响这个报错,需要单独处理。
5.5 插件安装报错 Extension not found
报错原文:Extension not found或Unable to install extension。
原因:extensionsGallery的itemUrl或resourceUrlTemplate配置不对,Cursor 拿不到插件的下载地址。回到product.json检查这两个字段的值,确保和本文第 3 节的片段一致。改完记得完全退出 Cursor 再重启,不能只关窗口。
如果某个特定插件装不上,换一个插件试试。如果所有插件都装不上,说明是extensionsGallery的问题;如果只有个别插件装不上,可能是该插件本身下架了。
6. 把插件源和 API 通道一次配好
改product.json解决的是插件市场的问题,配 Base URL 和 Key 解决的是 AI 能力的问题。两件事都做完,Cursor 才算真正可用。我自己的习惯是:装完 Cursor 第一件事就是改extensionsGallery,第二件事就是配 TaoToken 的 Key,然后跑一次 curl 验证,最后发一条 Chat 测试。整个流程五分钟以内。
如果你还没生成 Key,去 TaoToken 控制台的 API Keys 页面创建一个,然后回到 Cursor 的settings.json填进去。插件装不上和 API 报错是两类问题,排查时先确认是哪一类,再按本文第 5 节的对照表定位。改完配置记得完全退出 Cursor 再重启,这一步很多人漏掉,导致改了没生效。