Cursor 插件接入 Salesforce Hosted MCP:SOQL/SOSL 查询、记录 CRUD 与 OAuth 配置完整指南
【免费下载链接】pluginsCursor plugin specification and official plugins项目地址: https://gitcode.com/GitHub_Trending/plugins125/plugins
本篇指南以 Cursor 官方插件仓库中的 Salesforce 插件(third_party/salesforce/README.md)为蓝本,完整讲解如何让 Cursor 中的 Agent 通过 Salesforce 官方托管的 Model Context Protocol(Hosted MCP)服务连接你的 Salesforce 组织:运行 SOQL 与 SOSL 查询、查看对象 Schema、遍历关系、创建/更新/删除记录,并且全部操作都在当前登录用户的权限与字段级安全(FLS)约束下执行。读完本文,你将掌握从 External Client App 创建、OAuth Scope 配置、MCP 服务器激活到插件变量填写的端到端实操方法,并理解每一步背后的原理与常见故障的排除思路。
插件能做什么:Agent 与 Salesforce 之间的官方 MCP 桥梁
Salesforce 插件是 Cursor 官方插件市场(.cursor-plugin/marketplace.json)中的第三方集成插件,市场条目将其定位为 "Query, create, and update records in your org."。它把 Agent 连接到 Salesforce 的第一方 Hosted MCP 服务(Salesforce Hosted MCP),而不是社区维护的自建 MCP 桥接层,因此在安全模型、令牌签发和权限继承上都有官方保障。
通过该插件,Agent 可以获得以下核心能力:
- 运行SOQL(Salesforce Object Query Language)与SOSL(Salesforce Object Search Language)查询;
- 检视对象 Schema(字段、类型、必填性等元数据);
- 遍历对象关系(lookup / master-detail 等关联);
- 对记录执行**创建(create)、更新(update)、删除(delete)**操作。
关键的安全特性是:所有这些工具调用都在已登录用户的自身权限和字段级安全(FLS)下执行。也就是说,插件不会绕过组织内的 Profile / Permission Set 与 FLS 配置,Agent 能看见什么、能改什么,与用户在 Salesforce 中被授予的权限严格一致。这一点在后面"团队市场"的配置小节中会再次体现。
快速安装:两种方式
安装 Salesforce 插件有两种等效途径:
- 打开Cursor Settings → Plugins,搜索Salesforce,点击Install;
- 安装完成后,需要设置服务器 URL(server URL)和Consumer Key(具体取值方法见后文),并完成 Salesforce 登录授权流程。
或者在聊天框中直接运行斜杠命令:
/add-plugin salesforce命令方式会直接触发插件的安装流程,之后同样进入 URL / Consumer Key 配置与登录环节。
理解插件的 MCP 配置:HTTP 传输 + OAuth
插件通过 MCP 的HTTP 传输方式(type: "http")连接 Salesforce Hosted MCP 服务器。仓库中插件的实际 MCP 配置见 third_party/salesforce/mcp.json,内容如下:
{ "mcpServers": { "salesforce": { "type": "http", "url": "${SALESFORCE_MCP_URL}", "auth": { "CLIENT_ID": "${CLIENT_ID}", "scopes": ["mcp_api", "refresh_token"] } } } }配置要点逐项拆解:
| 配置项 | 含义 | 取值说明 |
|---|---|---|
type | 传输协议 | 固定为http,走 MCP over HTTP(含 OAuth 授权) |
url | MCP 服务器地址 | 由插件变量SALESFORCE_MCP_URL注入,即你在 Setup 中激活的 MCP 服务器的Server URL |
auth.CLIENT_ID | OAuth 客户端标识 | 由插件变量CLIENT_ID注入,即你在 Salesforce 中创建的External Client App 的 Consumer Key |
auth.scopes | OAuth 授权范围 | 固定为mcp_api(访问 Hosted MCP 服务器)与refresh_token(离线刷新令牌)两个 scope |
注意,URL 与 CLIENT_ID 都通过${变量}占位符引用,而不是硬编码。这正是 Cursor 插件清单(manifest)中variables(插件变量)机制的体现——参考 schemas/plugin.schema.json 中对variables字段的定义,插件通过声明变量让每个组织可以填入属于自己的服务器地址和客户端标识。插件的变更记录 third_party/salesforce/CHANGELOG.md 也明确写到:1.0.0 版本"DeclaredSALESFORCE_MCP_URLandCLIENT_IDplugin variables so each org can point at its own server and External Client App",并"Pinned OAuth scopes tomcp_apiandrefresh_token"——即 scope 是刻意收紧固定而非开放可选的。
前置准备:创建 External Client App
Salesforce Hosted MCP 的 OAuth 授权要求使用External Client App(外部客户端应用)。这一点与常规做法不同:Connected Apps 不被支持,请务必在 Setup 中走 External Client App 的创建路径。
第 1 步:新建 External Client App 并启用 OAuth
在 Setup 中进入External Client App Manager → New External Client App,填写基本信息后,展开API (Enable OAuth Settings)区块并勾选Enable OAuth。
随后需要添加回调 URL(Callback URL)。Cursor 在不同界面形态下使用不同的回调地址,所以凡是可能用到的都要添加齐全:
| 界面形态 | 回调 URL |
|---|---|
| 桌面端(Desktop) | http://localhost:8787/callback |
| Web 与 Cloud Agents | https://www.cursor.com/agents/mcp/oauth/callback |
| 较旧版本的桌面构建 | cursor://anysphere.cursor-mcp/oauth/callback |
回调地址缺失是 OAuth 失败的最常见原因之一:授权服务器会把授权码回调到注册的地址,如果 Cursor 实际使用的回调地址未注册,登录流程会中断。
第 2 步:选择 OAuth Scopes(务必精确,不要更宽)
在OAuth Scopes下,只选择恰好这两个 scope,不要选择任何更宽的范围:
- Access Salesforce hosted MCP servers(值
mcp_api) - Perform requests at any time(值
refresh_token,等价别名offline_access)
这里有两点实操提醒:
- 第二个 scope 很容易漏选,因为scope 选择器是按描述文本而不是按值(value)显示的,你需要在列表中仔细辨认 "Perform requests at any time"。缺少它,插件将无法刷新令牌(refresh),每个用户都得在访问令牌过期后重新认证一次。
- 不要添加Full access(值
full)——Hosted MCP 并不需要它,选择它是典型的最小权限原则违背。
第 3 步:配置 Security 选项(决定令牌类型)
在Security区块下,选择Issue JSON Web Token (JWT)-based access tokens for named users。这一步是强制要求:如果不启用,Salesforce 会签发不透明令牌(opaque token),结果是每一次工具调用都会失败并报错JWT Token is required。
其余安全选项的正确姿态:
- Leave Require Secret for Web Server Flow off:Cursor 以公开客户端(public client)身份使用PKCE完成授权,整个过程不涉及 client secret,因此无需开启该选项。
- 不要启用 JWT Bearer Flow:这是另一个不同的功能,需要证书(certificate),与本插件场景无关。
第 4 步:复制 Consumer Key 并耐心等待传播
创建完成后,从Settings → Consumer Key and Secret中复制Consumer Key,稍后填入插件配置。
需要注意传播延迟:新建的 External Client App 最长可能需要 30 分钟才会在组织中完全生效。在生效前,认证会以invalid_client_id失败。遇到该报错时请耐心等待,而不要反复重建应用(重建只会重置传播计时)。
激活 MCP 服务器并选择"爆炸半径"
在 Setup 中打开MCP Servers,激活你想要使用的服务器,然后复制它的Server URL。这个 URL 同时编码了组织类型(生产 vs 沙箱)和服务器种类(标准 vs 自定义):
| 组织类型 | 标准服务器(Standard) | 自定义服务器(Custom) |
|---|---|---|
| Production / Developer / Enterprise | https://api.salesforce.com/platform/mcp/v1/platform/sobject-all | https://api.salesforce.com/platform/mcp/v1/custom/myserver |
| Sandbox 或 scratch org | https://api.salesforce.com/platform/mcp/v1/sandbox/platform/sobject-all | https://api.salesforce.com/platform/mcp/v1/sandbox/custom/myserver |
注意两条规律:
- 沙箱 / scratch org 的 URL 含
/sandbox/路径段。URL 中的组织类型必须与你实际登录的 org 匹配,否则会出现"认证成功但服务器 404"的怪象(见故障排查表)。 - 自定义服务器的最后一段
myserver是你自定义服务器在 Setup 中的名称。
Salesforce 官方提供了若干标准服务器(standard servers),它们的"爆炸半径"(blast radius,即能执行的操作范围)不同:
sobject-reads— 只读访问;sobject-mutations— 读 + 创建 + 更新;sobject-deletes— 在读与变更之外额外开放删除;sobject-all— 全部能力(读、增、改、删)。
实践建议:把插件指向能完成工作所需的最窄(narrowest)服务器。例如只做查询分析的场景应选sobject-reads,而不是图省事直接选sobject-all——这与 External Client App 的 scope 收紧逻辑一脉相承,都是最小权限原则的落地。
配置插件并完成登录
在Dashboard → Plugins → Configure中,填入两个值:
- Salesforce MCP server URL:即上一步复制的 Server URL(对应变量
SALESFORCE_MCP_URL); - Salesforce Consumer Key:即 External Client App 的 Consumer Key(对应变量
CLIENT_ID)。
填好后,在 Cursor 弹出登录提示时完成 Salesforce 登录(OAuth + PKCE 流程)。之后 Agent 的工具调用便会经由已激活的 Hosted MCP 服务器执行。
团队市场(Team Marketplace)下的权限模型
如果插件是通过团队市场分发的,管理员只需要一次性设置好 Server URL 和 Consumer Key 这两个值;但每一位团队成员仍然需要各自独立完成 Salesforce 登录认证。这意味着:
- 每个成员的工具调用以其**自己的对象权限(object permissions)和字段级安全(FLS)**为边界执行;
- 管理员配置的值只决定"连到哪台服务器、用哪个客户端",不决定"以谁的权限运行"。
这正是本文开头所述"所有操作都在已登录用户自身权限下执行"的团队级体现:同一插件、同一组织,不同成员看到的数据与可执行的操作可以因权限不同而不同。
故障排查速查表
README 提供的故障排查表可以直接作为排障手册使用:
| 症状 | 原因 | 处理 |
|---|---|---|
invalid_client_id | External Client App 尚未完成传播 | 等待最多 30 分钟,不要重建应用 |
invalid_scope | App 缺少Access Salesforce hosted MCP servers或Perform requests at any time | 回到 External Client App 补齐这两个 scope |
登录成功后报JWT Token is required或Invalid token | 未启用Issue JSON Web Token (JWT)-based access tokens for named users | 在 Security 区块启用该选项 |
| 认证成功但服务器 404 | MCP 服务器未在 Setup 中激活,或 URL 的组织类型与登录的 org 不匹配 | 激活对应服务器,核对 URL 中是否包含/sandbox/段 |
理解这些报错背后的机制会很有帮助:JWT Token is required说明 Salesforce 预期签发/使用 JWT 访问令牌,而你的 App 配置仍在签发不透明令牌;invalid_scope说明授权请求中的 scope 集合与 App 上注册的不一致;404 则多半是"客户端与服务器"两侧配置错位(未激活或 URL 与 org 类型不符)。
仓库视角:插件如何被组织与校验
作为 Cursor 官方插件仓库的一部分,Salesforce 插件的构成可以在仓库中直接核验:
- 插件核心声明:third_party/salesforce/mcp.json —— 上文已完整解读的 HTTP + OAuth MCP 配置;
- 版本与变更:third_party/salesforce/CHANGELOG.md —— 1.0.0 初始版本,固定 scope 为
mcp_api+refresh_token,声明两个插件变量; - 市场条目:.cursor-plugin/marketplace.json ——
salesforce条目指向third_party/salesforce,描述为 "Query, create, and update records in your org."; - 清单 Schema:schemas/plugin.schema.json —— 定义了插件清单中
mcpServers(可指向配置文件、内联对象或数组)与variables的结构约束; - 校验脚本:scripts/validate-plugins.mjs —— 仓库用 Ajv 对 marketplace 与各插件清单做 Schema 校验,确保每个市场条目的 source 目录、plugin.json 及其字段符合规范,这为插件的可分发性提供了自动化保障。
如果你要在自己的组织里部署,无需改动仓库任何文件:安装、填写变量、登录三步即可运行;更多官方文档索引(External Client App 创建、可用的标准服务器参考等)可回到 third_party/salesforce/README.md 的 Docs 小节查看。
许可证
该插件以MIT License发布(见 third_party/salesforce/LICENSE),可自由使用与二次分发。
【免费下载链接】pluginsCursor plugin specification and official plugins项目地址: https://gitcode.com/GitHub_Trending/plugins125/plugins
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考