使用 MCP 工具 execute_metadata_action 生成 Salesforce Flow。当用户要求创建、构建或生成 Flow(包括屏幕流程、自动启动流程、记录触发流程(保存前/保存后)、计划流程)时使用。对于类似 Flow 的请求也触发,例如“创建记录时”、“每天触发”、“发送电子邮件时”、“更新字段时”、“自动化”、“工作流”或“Flow XML/元数据”。这是唯一用于 Salesforce Flow 生成的技能。
目标
通过运行必需的 3 步 MCP 管道(fetchGroundedObjectMetadata → flowElementSelection → flowElementGeneration)生成 Salesforce Flow 元数据,并返回 Flow XML。
何时使用此技能
在以下情况下使用此技能:
- 创建任何类型的 Flow(屏幕流程、自动启动流程、记录触发流程、计划流程)
- 生成 Flow 元数据 XML
- 无需代码即可自动化业务流程
- 构建用户引导的工作流或后台自动化
- 排查与 Flow 相关的部署错误
规范
Flow 元数据规范
概述
Salesforce Flow 是强大的自动化工具,无需代码即可实现复杂的业务流程自动化。Flow 可以通过交互式屏幕收集和处理数据,执行逻辑和计算,操作记录,调用外部服务,并根据各种事件触发。Flow 类型包括屏幕流程(用户引导)、自动启动流程(后台处理)、记录触发流程(数据库事件)和计划流程(基于时间)。
目的
- 使用声明式逻辑和分支自动化复杂的业务流程
- 通过屏幕流程引导用户完成多步骤数据收集和决策工作流
- 自动对 Salesforce 记录执行 CRUD 操作
- 通过自动启动流程执行后台处理和集成
- 使用记录触发流程实时响应记录更改
- 使用计划流程安排重复任务和批处理操作
- 创建可重用、可维护的自动化,管理员无需代码即可修改
Flow 生成管道
强制要求:您必须严格遵循此 3 步管道。无例外。无捷径。不得跳过步骤。不得手动创建 Flow 元数据 XML 或尝试在此管道之外生成 Flow 元数据。不得尝试使用任何其他工具、API 或方法来生成 Flow 元数据。此管道是生成 Flow 的唯一受支持方式。任何偏差都会产生无效或损坏的元数据。
MCP 连接详细信息
所有 3 个管道步骤必须使用此 MCP 工具调用:
- MCP 工具名称:
execute_metadata_action action参数选择要运行的管道步骤:"fetchGroundedObjectMetadata"、"flowElementSelection"或"flowElementGeneration"
Flow 生成是一个严格的 3 步管道。所有步骤必须按顺序调用。每个步骤都是必需的。没有替代方法——这是生成 Flow 元数据的唯一方式:
步骤 1(必需):获取基础对象元数据(fetchGroundedObjectMetadata)
获取与 Flow 生成请求相关的组织架构元数据。此步骤必须始终首先调用。
输入(全部必需):
- userPrompt(字符串,必需):用户的自然语言请求
- inflightMetadata(数组,必需):来自本地 sfdx 项目的自定义对象/字段。如果不需要,使用空数组
[]。
输出:
- groundingMetadata(字符串):与请求相关的组织架构的基础对象元数据,以 JSON 字符串形式返回。您必须直接将其传递给步骤 2——它已经是字符串,无需再次序列化。
步骤 2(必需):Flow 元素选择(flowElementSelection)
根据用户提示和基础元数据选择 Flow 元素(赋值、决策、记录操作等)及其连接。此步骤必须在步骤 1 之后调用。
输入(全部必需):
- userPrompt(字符串,必需):用户的自然语言请求(必须与步骤 1 中的值相同)
- groundingMetadata(字符串,必需):组织架构元数据(必须是步骤 1 输出返回的确切字符串——直接传递,不要再次序列化)
- operationId(字符串,必需):操作 ID(首次调用使用空字符串
"")
输出:
- operationId(字符串):操作 ID。您必须将其传递给步骤 3。
- userOutput(字符串):下一步的推理。您可以向用户显示此内容。
步骤 3(必需):Flow 元素生成(flowElementGeneration)
逐个元素生成 Flow 元数据。此步骤必须在步骤 2 之后调用。必须循环重复调用,直到 isComplete 为 true。
输入(全部必需):
- operationId(字符串,必需):来自步骤 2 输出的操作 ID
- requestSource(字符串,必需):请求的来源。使用
"A4V"以 XML 格式获取 Flow 元数据。
输出:
- isComplete(布尔值):指示 Flow 生成是否完成。您必须检查此值。
- result(字符串):Flow 元素生成的结果。仅当
isComplete为true时包含最终 Flow 元数据。
强制要求:循环直到完成。切勿暂停或询问用户确认继续。
- Flow 可以有任意数量的元素(10、15 或更多)。每次调用生成一个元素,因此您可能需要多次迭代。这是预期且正常的。
- 使用步骤 2 中的
operationId和requestSource(对于 XML 输出使用"A4V",对于 JSON 使用空字符串或其他值)调用flowElementGeneration。 - 每次调用后检查
isComplete输出和result字段。 - 如果
isComplete为false且未返回错误,则必须使用步骤 2 中的相同operationId再次调用flowElementGeneration。不要询问用户是否要继续。不要暂停。不要在循环中总结进度。只需继续调用。 - 不要停止,直到
isComplete为true或可调用操作返回错误。没有最大迭代次数——无论需要多少次调用,都要继续。 - 当
isComplete为true时,从result字段提取 Flow 元数据。 - 如果返回错误,停止循环并向用户显示错误。
严格约束(关键)——这些规则适用于生成管道返回的 XML:
- 不要修改任何块内的内容、值或子节点。
- 不要添加新节点、标签、属性或文本(不要添加缺失的标签、X/Y 坐标等)。
- 不要删除任何现有节点。
inflightMetadata 格式
数据类型:数组(不是字符串)
严格命名约定 - 必须完全遵循:
| 属性 | 正确名称 | 不要使用 |
|---|---|---|
| 对象 API 名称 | apiName |
objectApiName、name、objectName |
| 字段 API 名称 | apiName |
fieldApiName、name、fieldName |
| 字段类型 | type |
fieldType、dataType |
| 查找目标 | referenceTo |
relatedTo、lookupTo、reference |
当需要自定义对象时(示例格式显示多种字段数据类型):
[
{
"type": "CustomObject",
"apiName": "CustomerRequest__c",
"label": "Customer Request",
"fields": [
{
"apiName": "Status__c",
"type": "Picklist",
"label": "Status",
"values": ["New", "In Progress", "Completed"]
},
{
"apiName": "Priority__c",
"type": "Number",
"label": "Priority"
},
{
"apiName": "AssignedTo__c",
"type": "Lookup",
"label": "Assigned To",
"referenceTo": "User"
},
{
"apiName": "Description__c",
"type": "Textarea",
"label": "Description"
},
{
"apiName": "Email__c",
"type": "Email",
"label": "Contact Email"
},
{
"apiName": "DueDate__c",
"type": "Date",
"label": "Due Date"
},
{
"apiName": "IsUrgent__c",
"type": "Boolean",
"label": "Is Urgent"
},
{
"apiName": "Amount__c",
"type": "Currency",
"label": "Amount"
}
],
"relationships": []
}
]
支持的字段类型:文本、文本区域、数字、选择列表、查找、电子邮件、电话、URL、日期、日期时间、布尔值、复选框、货币、百分比
当不需要自定义对象时:
[]
inflightMetadata 的强制决策逻辑(数据类型:数组)
- 必需 - 首先:扫描本地 sfdx 项目中与用户 Flow 请求相关的自定义对象和字段。
- 如果找到相关的自定义对象:您必须提取它们并作为结构化对象数组传递(见上面的格式)
- 如果未找到相关的自定义对象:您必须传递空数组
[](不是字符串"[]") - 切勿:在 inflightMetadata 中传递文本描述、说明或字符串表示
- 强制:数据类型必须是数组,而不是字符串
当自定义对象相关时对 Vibes 的说明:
- 提取对象元数据并映射到 JSON 属性:
apiName:对象的 API 名称(自定义对象带有__c后缀)label:对象的显示标签type:设置为"CustomObject"fields:字段对象数组,每个包含:apiName:字段的 API 名称(自定义字段带有__c后缀)type:字段类型(文本、数字、选择列表、查找等)label:字段的显示标签values:(仅选择列表)选择列表值数组referenceTo:(仅查找)目标对象 API 名称
- 仅包含与正在生成的 Flow 相关的对象和字段
强制增强规则
- userPrompt:必需。
- 如果用户请求单个 Flow:按原样使用用户的提示。
- 如果用户请求多个 Flow:您必须拆分请求并为每个单独的 Flow 编写单独的、专注的
userPrompt。每个userPrompt必须仅描述一个 Flow。不要将整个多 Flow 请求作为单个userPrompt传递。请参阅下面的多个 Flow 部分以获取示例。
- inflightMetadata:必需。始终使用数组数据类型。
- 当不需要自定义对象时,必须使用
[](空数组) - 当自定义对象相关时,必须使用结构化对象数组
- 切勿使用字符串
"[]"- 这是不正确的 - 切勿使用文本描述 - 仅使用结构化对象元数据
- 当不需要自定义对象时,必须使用
强制:多个 Flow = 多个单独的管道
首先:在调用任何管道步骤之前,检查用户的请求是否包含多个 Flow。如果是,您必须将其拆分为单独的单个 Flow 提示。每个 Flow 获得自己的 3 步管道,其 userPrompt 仅描述该一个 Flow。
切勿将多 Flow 请求作为单个 userPrompt 字段传递。切勿将多个 Flow 描述合并到一个 userPrompt 中。
当用户请求多个 Flow(例如,“为我的应用创建 Flow:1) ... 2) ... 3) ...”)时,您必须:
- 拆分请求为单独的各个 Flow 描述。
- 为每个 Flow 运行单独的 3 步管道,使用仅描述该一个 Flow 的
userPrompt。 - 顺序执行所有管道——一个接一个,切勿并行。不要在第一个 Flow 后停止。不要等待用户要求您继续。不要总结并停止。继续直到每个请求的 Flow 都已完全生成。
错误 - 多个 Flow 合并到一个 userPrompt 中:
{
"userPrompt": "为应用创建 Flow:1) 在 ResourceAllocation__c 上创建记录触发 Flow 以更新 Resource__c。2) 创建屏幕 Flow 以分配资源。3) 在 Supply__c 上创建记录触发 Flow 以自动标记 Low_Stock__c。",
...
}
正确 - 为每个 Flow 单独调用:
Flow 1 - 步骤 1(fetchGroundedObjectMetadata):
{
"userPrompt": "创建一个名为 Tenant_Onboarding 的屏幕 Flow,捕获租户详细信息,选择 Status__c = 'Vacant' 的 Unit__c,创建 Lease__c...",
"inflightMetadata": [...]
}
然后使用步骤 1 中的 groundingMetadata 调用步骤 2(flowElementSelection),然后使用步骤 2 中的 operationId 调用步骤 3(flowElementGeneration)。
Flow 2 - 步骤 1(fetchGroundedObjectMetadata):
{
"userPrompt": "创建一个名为 Generate_Onboarding_Checklist 的自动启动 Flow,给定 Lease__c Id 输入,查询 OnboardingTask__c...",
"inflightMetadata": [...]
}
然后为此 Flow 调用步骤 2 和步骤 3。
Flow 3 - 步骤 1(fetchGroundedObjectMetadata):
{
"userPrompt": "创建一个名为 Sync_Unit_On_Lease_Changes 的记录触发 Flow,在插入和更新 Lease__c 时...",
"inflightMetadata": [...]
}
然后为此 Flow 调用步骤 2 和步骤 3。
强制规则:
- 如果有 N 个 Flow 要生成,则必须有 N 个单独的 3 步管道,并且必须执行所有 N 个管道。无例外。不要仅生成一个 Flow 后停止。
- 您必须完全完成当前 Flow 的 3 步管道(包括循环步骤 3 直到
isComplete为true或返回错误)才能开始下一个 Flow 的管道。 不要跨 Flow 交错或并行管道。一切都是顺序的——切勿并行。 - 完成 Flow 的管道后,立即开始下一个 Flow 的管道。不要在 Flow 之间暂停、总结或等待用户确认。
- 对于每个 Flow,您必须扫描本地 sfdx 项目以使用特定于该 Flow 提示的自定义对象/字段填充
inflightMetadata。 - 每个 Flow 管道必须有自己的
inflightMetadata,仅包含与该特定 Flow 相关的对象/字段。
示例工具调用
示例 1:仅标准对象(无自定义对象)
步骤 1 - fetchGroundedObjectMetadata:
{
"userPrompt": "创建一个名为 Daily_Good_Morning 的计划触发 Flow,每天上午 6:00 运行并向运行用户发送问候电子邮件。",
"inflightMetadata": []
}
步骤 2 - flowElementSelection:
{
"userPrompt": "创建一个名为 Daily_Good_Morning 的计划触发 Flow,每天上午 6:00 运行并向运行用户发送问候电子邮件。",
"groundingMetadata": "<来自步骤 1 的 groundingMetadata 字符串 — 直接传递,不要再次序列化>",
"operationId": ""
}
步骤 3 - flowElementGeneration(循环调用):
{
"operationId": "<来自步骤 2 的 operationId>",
"requestSource": "A4V"
}
使用相同的 operationId 重复调用,直到 isComplete 为 true 或返回错误。Flow 可以有任意数量的元素,因此预计会有多次迭代。当 isComplete 为 true 时,从 result 字段提取 Flow 元数据。使用 "requestSource": "A4V" 以 XML 格式获取 Flow 元数据。
示例 2:使用本地 sfdx 项目中的自定义对象
步骤 1 - fetchGroundedObjectMetadata:
{
"userPrompt": "创建一个 Flow,在分配客户请求时更新其状态",
"inflightMetadata": [
{
"type": "CustomObject",
"apiName": "CustomerRequest__c",
"label": "Customer Request",
"fields": [
{
"apiName": "Status__c",
"type": "Picklist",
"label": "Status",
"values": ["New", "In Progress", "Completed"]
},
{
"apiName": "AssignedTo__c",
"type": "Lookup",
"label": "Assigned To",
"referenceTo": "User"
}
],
"relationships": []
}
]
}
步骤 2 - flowElementSelection:
{
"userPrompt": "创建一个 Flow,在分配客户请求时更新其状态",
"groundingMetadata": "<来自步骤 1 的 groundingMetadata 字符串 — 直接传递,不要再次序列化>",
"operationId": ""
}
步骤 3 - flowElementGeneration(循环调用):
{
"operationId": "<来自步骤 2 的 operationId>",
"requestSource": "A4V"
}
使用相同的 operationId 重复调用,直到 isComplete 为 true 或返回错误。Flow 可以有任意数量的元素,因此预计会有多次迭代。当 isComplete 为 true 时,从 result 字段提取 Flow 元数据。使用 "requestSource": "A4V" 以 XML 格式获取 Flow 元数据。
强制最佳实践
- 始终遵循 3 步管道:fetchGroundedObjectMetadata → flowElementSelection → flowElementGeneration。这是生成 Flow 元数据的唯一方式。没有替代方案。
- 不要在此管道之外手动创建 Flow 元数据 XML、JSON 或任何其他格式。
- 当用户明确要求修复已生成 Flow XML 中的验证或部署错误时,您被允许对 XML 进行有针对性的手动编辑以解决这些错误。这是“无手动元数据”规则的唯一例外。
- 不要尝试通过跳过步骤或合并步骤来“优化”。每个步骤都是原子的且必需的。
- 切勿跳过管道中的任何步骤。所有 3 个步骤都是必需的。
- 切勿在不调用所有 3 个步骤的情况下尝试生成 Flow 元数据。
- 切勿在任何情况下偏离此管道——即使您认为自己知道 Flow 结构。
- 对于单个 Flow 请求:您必须使用用户提示作为
userPrompt。 - 对于多个 Flow 请求:您必须为每个 Flow 运行单独的 3 步管道顺序执行(一个接一个,切勿并行),并且必须执行所有管道——不要在第一个 Flow 后停止。
- 您必须将 Flow 要求放在
userPrompt中,而不是inflightMetadata中。 inflightMetadata仅用于来自本地项目的自定义对象/字段元数据(见上文)。无例外。- 步骤 3 必须使用步骤 2 中的相同
operationId循环调用,直到isComplete为true或返回错误。Flow 可以有任意数量的元素——不要提前停止,不要暂停询问用户是否要继续,无论需要多少次迭代。 - 您必须仅在
isComplete为true时从result字段提取 Flow 元数据。
关键验证清单(必须在每次 Flow 生成之前和之后验证)
未能完全遵循此清单将导致 Flow 元数据损坏或缺失。
- [ ] 管道:所有 3 个步骤均按严格顺序调用(fetchGroundedObjectMetadata → flowElementSelection → flowElementGeneration)。没有跳过任何步骤。
- [ ] 无手动元数据:Flow 元数据不是在此管道之外以任何方式手动创建、修改或生成的
- [ ] 无偏差:没有使用替代工具、API 或方法代替或与此管道一起使用
- [ ] userPrompt 包含单个 Flow 提示。如果用户请求多个 Flow,则请求已拆分,每个管道收到单独的
userPrompt,仅描述一个 Flow - [ ] userPrompt 一致地传递给步骤 1 和步骤 2(相同的值)
- [ ] inflightMetadata 是数组数据类型(不是字符串)
- [ ] inflightMetadata 在不需要自定义对象时为
[] - [ ] inflightMetadata 包含通过扫描本地 sfdx 项目提取的相关自定义对象/字段的结构化对象
- [ ] inflightMetadata 不包含
"[]"(字符串) - 必须是[](数组) - [ ] inflightMetadata 不包含文本描述或说明
- [ ] 步骤 1 输出的 groundingMetadata 直接传递给步骤 2 输入(它已经是字符串——不要再次序列化)
- [ ] 步骤 2 输出的 operationId 传递给步骤 3 输入
- [ ] requestSource 应始终设置为
"A4V" - [ ] 步骤 3 使用步骤 2 中的相同
operationId循环调用,直到isComplete为true或返回错误——无论多少次迭代,都不要暂停、不要询问用户继续 - [ ] 多 Flow:每个 Flow 的完整管道在开始下一个 Flow 的管道之前完成(无交错)
- [ ] result 字段仅在
isComplete为true时用于提取 XML Flow 元数据 - [ ] 不向 XML 添加内容:没有添加原始管道输出中不存在的元素、属性或属性。没有插入任何内容(没有
<label>、<description>或任何其他节点)。最终 XML 必须与管道返回的完全相同。 - [ ] 错误修复例外:如果用户明确要求修复验证/部署错误,则允许对 XML 进行有针对性的手动编辑,并且“不向 XML 添加内容”/“无手动元数据”约束不适用于这些编辑。






