Salesforce元工具:身份传播
  
一个标志。七个工具。您的整个Salesforce组织,用户自己的身份在端到端强制执行。
建筑
draw.io源代码
问题
1.无需为每个对象提供工具即可完全访问CRM
代理应该能够完成用户在Salesforce中可以做的一切(查询任何对象、更新任何记录、运行任何审批工作流),而无需服务器为每个对象定义一个工具。大多数MCP服务器采取相反的方法:每个对象一个工具,这意味着每个新的自定义对象都需要更改代码,工具列表呈线性增长,安全模型必须从头开始重新实现。目标是为代理提供用户的完整CRM界面,同时继承Salesforce已经实施的权限和安全性。
2.用户自己的权限,而不是服务帐户的权限
如果代理可以在Salesforce中执行所有操作,则它必须在用户自己的身份下运行,具有共享规则、字段级安全性和审批工作流,而不是一个可以看到所有数据的服务帐户。大多数集成通过在中间件中重新创建权限层来解决这个问题。更简单的答案是端到端传播用户的身份,并让Salesforce执行其已有的规则,即使该身份可能通过联合IdP从Azure AD跨越边界到Salesforce。
本项目
元数据驱动的MCP服务器解决了这两个问题:七个工具,让AI代理发现对象、学习字段模式,并在运行时构建SOQL查询(元工具模式),具有真正的代表身份传播,端到端强制用户自己的权限。用户向Azure AD进行一次身份验证;系统处理其余部分。
azd up # deploys the full stack in ~15 minutes______________________________________________________________________
运作原理
用户提出了一个问题。代理发现对象、学习模式和查询Salesforce——所有这些都是通过相同的七个工具完成的,所有这些工具都有用户自己的身份。
排除来源
代表(OBO)代币交易所
APIM处理三阶段交换:验证Azure AD JWT,解析Salesforce用户名,并获取每个用户的Salesforce令牌。MCP服务器永远看不到Azure AD凭据。
深潜: OBO交换详细动画 | 完整细节PNG | 排除来源
7种工具:约1300个Salesforce代币
| 工具 | 代币 | 它的作用 |
|---|---|---|
whoami | ~60 | 从承载令牌中解析当前用户的身份 |
list_objects | 117 | 发现对象(典型组织中超过1000个),按名称/标签过滤 |
describe_object | 109 | 字段模式、类型、必需标志、选择列表、外部ID |
soql_query | 225 | 完整SOQL:关系、聚合、GROUP BY、自动分页 |
search_records | 175 | 同时跨多个对象进行SOSL全文搜索 |
write_record | 226 | 创建、更新、追加销售(通过外部ID)、删除 |
process_approval | 129 | 通过Salesforce审批工作流提交、批准、拒绝 |
| 服务器说明 | ~270 | 工作流程指导、惯例、何时使用哪种工具 |
| 总计 | ~1,300 | 所有对象、所有字段、所有操作 |
注: 1235个标记涵盖了工具定义。每 describe_object 调用在运行时返回字段模式。模式是按需加载的,而不是预先加载到系统提示符中。______________________________________________________________________
深入探究
有关详细的技术说明,请参阅 docs/deepdive.md:
- 元工具模式 --为什么七个工具胜过一个对象,并进行代币成本比较
- 工具参考 --基于Unix类比的工具描述
- 身份传播:端到端 --架构、逐跳令牌跟踪、缓存层、密钥保证
- IdP灵活性 --如何将Azure AD替换为Okta、PingFed或其他OIDC提供商
- 当前范围和限制 --生产注意事项
- 图表来源 --两个序列图的Mermaid来源
______________________________________________________________________
部署和设置
这个项目的新手? 跟随 分步安装指南 从干净的Azure订阅和Salesforce组织中获取完整的演练。
先决条件
| 需求 | 版本 | 链接 |
|---|---|---|
| Azure订阅 | 贡献者+用户访问管理员 | 免费试用 |
| Azure开发人员命令行界面 | 1.5+ | 安装azd |
| Azure命令行界面 | 2.60+ | 安装az |
| Python | 3.11+ | python.org |
| Docker桌面 | - | |
| Salesforce命令行界面 | sf 2.x | 安装sf |
| OpenSSL | - | 预装在macOS/Linux上; Windows 版 Git 包括它 |
| Salesforce组织 | 开发人员或沙盒 | developer.salesforce.com |
快速部署
如果您已经配置了Salesforce组织和证书:
git clone https://github.com/ozgurkarahan/salesforce-meta-tool-identity-propagation.git
cd salesforce-meta-tool-identity-propagation
pip install -r requirements.txt
azd env new obo
azd env set SF_INSTANCE_URL "https://your-org.my.salesforce.com"
azd env set SF_CONNECTED_APP_CLIENT_ID ""
azd env set SF_SERVICE_ACCOUNT_USERNAME ""
azd up后视镜挂钩自动上传 certs/sf-jwt-bearer.pfx 到密钥库,创建APIM证书绑定,并设置 SF_JWT_BEARER_CERT_THUMBPRINT。不需要手动指纹步骤。
之后 azd up 完成后,打开末尾打印的聊天应用程序URL。使用您的Azure AD帐户登录并发送消息(例如。, *“显示我的Salesforce帐户”*).
从零开始
azd env set SF_INSTANCE_URL "https://your-org.my.salesforce.com"
azd env set SF_CONNECTED_APP_CLIENT_ID ""
azd env set SF_SERVICE_ACCOUNT_USERNAME ""- 部署:
azd up - 映射用户身份 --看 安装指南第4阶段
环境变量
| 变量 | 必填 | 描述 |
|---|---|---|
SF_INSTANCE_URL | 是 | Salesforce组织URL(例如。, https://myorg.my.salesforce.com) |
SF_CONNECTED_APP_CLIENT_ID | 是 | Salesforce Connected应用程序中的消费者密钥 |
SF_SERVICE_ACCOUNT_USERNAME | 是 | 用于SOQL用户查找的SF服务帐户用户名 |
SF_JWT_BEARER_CERT_THUMBPRINT | Auto | 通过后置钩子自动设置;仅在跳过证书上传时手动设置 |
SF_JWT_BEARER_CERT_NAME | 否 | 密钥库证书名称(默认值: sf-jwt-bearer) |
IDENTITY_CLAIM_NAME | 没有 | Azure AD JWT用户身份声明(默认值: oid) |
COGNITIVE_ACCOUNT_SUFFIX | 否 | 之后增加 azd down --purge 避免命名冲突 |
AZURE_LOCATION | 否 | Azure区域(默认值: swedencentral) |
项目结构
salesforce-meta-tool-identity-propagation/
+-- azure.yaml # azd project: 2 services (chat-app, salesforce-mcp)
+-- src/
| +-- salesforce-mcp/
| | +-- app.py # The MCP server: 7 tools, bearer passthrough
| | +-- salesforce_client.py # Async Salesforce REST client with auth
| +-- chat-app/
| +-- app.py # FastAPI backend, MSAL to Foundry agent bridge
| +-- static/ # Vanilla JS SPA with MSAL.js
+-- infra/
| +-- main.bicep # Orchestrator, all Azure resources
| +-- modules/ # APIM, Key Vault, Container Apps, AI Services, ...
| +-- policies/
| +-- sf-mcp-obo-policy.xml # OBO three-phase exchange policy
| +-- sf-mcp-obo-prm-policy.xml # RFC 9728 PRM for OBO endpoint
+-- hooks/
| +-- postprovision.py # Cert upload + Entra app + Foundry agent + OBO connection
+-- scripts/
| +-- sf_utils.py # Shared SF/CLI primitives
| +-- setup-sf-org.py # Complete 5-step SF org setup orchestrator
| +-- test-salesforce-mcp.py # E2E MCP server test
+-- docs/ # Architecture diagrams (Excalidraw)常见问题
| 问题 | 解决方案 |
|---|---|
“未找到项目”之后 azd down | 增量 COGNITIVE_ACCOUNT_SUFFIX 并重新部署 |
| APIM中断MCP流 | 将响应正文字节设置为 0 在APIM诊断中(所有API范围) |
| 代理在不调用工具的情况下响应 | 检查Foundry连接目标URL |
| 401“Azure AD令牌无效” | 检查 validate-jwt 发行者包括v1和v2 |
| 502“SF服务令牌失败” | 证书错误、客户端ID错误或服务帐户未预先授权 |
| 403“用户未映射” | 没有匹配的SF用户 FederationIdentifier.快跑 setup-sf-org.py --only fedid |
| 502“SF令牌交换失败” | 目标SF用户未预先授权连接的应用程序 |
______________________________________________________________________
相关项目
- 雪元工具 --ServiceNow对应物:相同的元工具模式和OBO身份传播,应用于ServiceNow ITSM。并排部署,为 客户360 AI Foundry代理,将Salesforce CRM数据与每个系统中用户自己身份下的ServiceNow事件、更改和请求相关联。
贡献
欢迎捐款。请打开 问题 或者提交拉取请求。
此项目使用 azd 部署。看 部署和设置 以使本地环境运行。
______________________________________________________________________
许可证
______________________________________________________________________
*相关文章: 元工具模式在企业中的应用 在LinkedIn上。*
