Salesforce Flow生成スキルは、MCPツール(execute_metadata_action)を使用してSalesforce Flows(Salesforceの自動処理フロー)を生成します。 次のような場合に使用: - ユーザーがフロー(画面フロー、自動起動フロー、レコード保存時の前後トリガーフロー、スケジュール実行フロー)の作成、構築、生成をリクエストした場合 - フローに関連する「レコード作成時に~する」「毎日の特定時刻に実行」「~の時にメール送信」「~の条件で項目を更新」「自動化」「ワークフロー」「フローのXML/メタデータ」といったリクエスト このスキルはSalesforce Flowの生成を行う唯一の専門スキルです。
Generate Salesforce Flows using the MCP tool execute_metadata_action. Use when the user asks to create, build, or generate a flow — including Screen, Autolaunched, Record-Triggered (before/after-save), Scheduled. Also trigger for flow-like requests such as "when a record is created", "trigger daily at", "send an email when", "update the field when", "automate", "workflow", or "flow XML/metadata". This is the only skill for Salesforce Flow generation.
Generate Salesforce Flow metadata by running the required 3-step MCP pipeline (fetchGroundedObjectMetadata → flowElementSelection → flowElementGeneration) and return the flow XML.
Use this skill when you need to:
Salesforce Flows are powerful automation tools that enable complex business process automation without code. Flows can collect and process data through interactive screens, execute logic and calculations, manipulate records, call external services, and trigger based on various events. Flow types include Screen Flows (user-guided), Autolaunched Flows (background processing), Record-Triggered Flows (database events) and Scheduled Flows (time-based).
MANDATORY: You MUST follow this exact 3-step pipeline. No exceptions. No shortcuts. No skipping steps. Do NOT manually create flow metadata XML or attempt to generate flow metadata outside of this pipeline. Do NOT attempt to use any other tool, API, or method to generate flow metadata. This pipeline is the ONLY supported way to generate flows. Any deviation will produce invalid or broken metadata.
All 3 pipeline steps MUST be called using this MCP tool:
execute_metadata_actionaction parameter selects which pipeline step to run: "fetchGroundedObjectMetadata", "flowElementSelection", or "flowElementGeneration"Flow generation is a strict 3-step pipeline. ALL steps must be called in order. Every step is required. There is no alternative approach — this is the only way to generate flow metadata:
fetchGroundedObjectMetadata)Fetches org schema metadata relevant to the flow generation request. This step is mandatory and must always be called first.
Inputs (all required):
[] if none needed.Outputs:
flowElementSelection)Selects flow elements (assignments, decisions, record ops, etc.) and their connections based on the user prompt and grounded metadata. This step is mandatory and must be called after Step 1.
Inputs (all required):
"" for first call)Outputs:
flowElementGeneration)Generates flow metadata element by element. This step is mandatory and must be called after Step 2. Must be called repeatedly in a loop until isComplete is true.
Inputs (all required):
"A4V" to get flow metadata in XML format.Outputs:
isComplete is true.MANDATORY: Loop until complete. NEVER pause or ask the user to confirm continuation.
flowElementGeneration with the operationId from Step 2 and requestSource (use "A4V" for XML output, empty string or other value for JSON).isComplete output and the result field after each call.isComplete is false and no errors are returned, you MUST call flowElementGeneration again with the same operationId from Step 2. Do NOT ask the user if they want to continue. Do NOT pause. Do NOT summarize progress mid-loop. Just keep calling.isComplete is true or the invocable action returns errors. There is no maximum number of iterations — keep going regardless of how many calls it takes.isComplete is true, extract the flow metadata from the result field.STRICT CONSTRAINTS (CRITICAL) — These rules apply to the XML returned by the generation pipeline:
DATA TYPE: ARRAY (not string)
STRICT NAMING CONVENTION - MUST FOLLOW EXACTLY:
| Property | Correct Name | Do NOT Use |
|---|---|---|
| Object API name | apiName |
objectApiName, name, objectName |
| Field API name | apiName |
fieldApiName, name, fieldName |
| Field type | type |
fieldType, dataType |
| Lookup target | referenceTo |
relatedTo, lookupTo, reference |
When custom objects are needed (sample format showing multiple field data types):
[
{
"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": []
}
]
Supported field types: Text, Textarea, Number, Picklist, Lookup, Email, Phone, URL, Date, Datetime, Boolean, Checkbox, Currency, Percent
When no custom objects needed:
[]
[] (NOT the string "[]")Instructions for Vibes when custom objects ARE relevant:
apiName: The object's API name (with __c suffix for custom objects)label: The object's display labeltype: Set to "CustomObject"fields: Array of field objects, each containing:
apiName: The field's API name (with __c suffix for custom fields)type: The field type (Text, Number, Picklist, Lookup, etc.)label: The field's display labelvalues: (Picklist only) Array of picklist valuesreferenceTo: (Lookup only) The target object API nameuserPrompt for each individual flow. Each userPrompt must describe only ONE flow. Do NOT pass the entire multi-flow request as a single userPrompt. See the multiple flows section below for examples.[] (empty array) when no custom objects needed"[]" - this is incorrectThe pipeline selects flow elements from your userPrompt. Vague prompts lead the pipeline to pick wrong structures, producing metadata that fails deployment. When the request matches one of the patterns below, make the intent explicit in the userPrompt you pass to Step 1 and Step 2 so the pipeline selects the correct elements.
A recurring, time-based flow is a Scheduled flow. The schedule lives on the start element: triggerType is Scheduled and a <schedule> block holds <frequency> (e.g. Weekly), <startDate>, and <startTime>. Do NOT expect startDate/startTime on a FlowScheduledPath element — a scheduled flow's cadence is on <start><schedule>, not a scheduled path.
To select records for a scheduled flow, put the record criteria in the start element's filters (with <object> and <filters> on <start>), which runs the flow once per matching record with $Record bound to each. Prefer this over adding a Loop that re-queries and iterates the same object — a start-filtered scheduled flow does not need a Loop to walk the triggering object's records.
When the prompt says "runs once a week / every Sunday / daily at a time", the userPrompt should state: scheduled trigger, the frequency, the start time, and the record filter on the triggering object.
To store a count of records, use a single assignment element with <operator>AssignCount</operator>, assigning from the collection (the record-lookup result) into a Number variable. Do NOT emit two assignment elements for one count, and do NOT give two assignment elements the same name — duplicate assignment names, or two assignments doing one logical count, fail deployment. One lookup → one AssignCount assignment → one record update.
Generate only the elements the prompt asks for. If a prompt names a trigger but not an action (e.g. "create a flow for when a record is created" with no stated behavior), do NOT add a Chatter post, email, or other action that was not requested. An unrequested action such as a chatterPost produces metadata that references undefined types and fails deployment. When the requested behavior is genuinely absent, generate the minimal valid trigger without inventing side effects.
FIRST: Before calling any pipeline step, check if the user's request contains multiple flows. If it does, you MUST split it into separate single-flow prompts. Each flow gets its own 3-step pipeline with its own userPrompt that describes ONLY that one flow.
NEVER pass a multi-flow request as a single userPrompt field. NEVER club multiple flow descriptions into one userPrompt.
When the user requests multiple flows (e.g., "Create flows for my app: 1) ... 2) ... 3) ..."), you MUST:
userPrompt that describes ONLY that one flow.WRONG - Multiple flows clubbed into one userPrompt:
{
"userPrompt": "Create flows for the app: 1) Record-Triggered Flow on ResourceAllocation__c to update Resource__c. 2) Screen Flow to allocate resources. 3) Record-Triggered Flow on Supply__c to auto-flag Low_Stock__c.",
...
}
CORRECT - Separate call for EACH flow:
Flow 1 - Step 1 (fetchGroundedObjectMetadata):
{
"userPrompt": "Create a Screen Flow named Tenant_Onboarding that captures tenant details, selects a Unit__c with Status__c = 'Vacant', creates Lease__c...",
"inflightMetadata": [...]
}
Then call Step 2 (flowElementSelection) with the groundingMetadata from Step 1, then Step 3 (flowElementGeneration) with the operationId from Step 2.
Flow 2 - Step 1 (fetchGroundedObjectMetadata):
{
"userPrompt": "Create an Autolaunched Flow named Generate_Onboarding_Checklist that given a Lease__c Id input, queries OnboardingTask__c...",
"inflightMetadata": [...]
}
Then call Step 2 and Step 3 for this flow.
Flow 3 - Step 1 (fetchGroundedObjectMetadata):
{
"userPrompt": "Create a Record-Triggered Flow named Sync_Unit_On_Lease_Changes that on insert and update of Lease__c...",
"inflightMetadata": [...]
}
Then call Step 2 and Step 3 for this flow.
Mandatory Rules:
isComplete is true or errors are returned) BEFORE starting the next flow's pipeline. Do NOT interleave or parallelize pipelines across flows. Everything is SEQUENTIAL — NEVER parallel.inflightMetadata with custom objects/fields specific to that flow prompt.inflightMetadata containing only the objects/fields relevant to that particular flow.Example 1: Standard objects only (no custom objects)
Step 1 - fetchGroundedObjectMetadata:
{
"userPrompt": "Create a scheduled-triggered Flow named Daily_Good_Morning that runs daily at 6:00 AM and sends an email to the running user saying good morning.",
"inflightMetadata": []
}
Step 2 - flowElementSelection:
{
"userPrompt": "Create a scheduled-triggered Flow named Daily_Good_Morning that runs daily at 6:00 AM and sends an email to the running user saying good morning.",
"groundingMetadata": "<groundingMetadata string from Step 1 — pass directly, do not serialize again>",
"operationId": ""
}
Step 3 - flowElementGeneration (call in a loop):
{
"operationId": "<operationId from Step 2>",
"requestSource": "A4V"
}
Call repeatedly with the same operationId until isComplete is true or errors are returned. A flow can have any number of elements, so expect multiple iterations. When isComplete is true, extract the flow metadata from the result field. Use "requestSource": "A4V" to get flow metadata in XML format.
Example 2: With custom objects from local sfdx project
Step 1 - fetchGroundedObjectMetadata:
{
"userPrompt": "Create a flow that updates the status of a Customer Request when it's assigned",
"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": []
}
]
}
Step 2 - flowElementSelection:
{
"userPrompt": "Create a flow that updates the status of a Customer Request when it's assigned",
"groundingMetadata": "<groundingMetadata string from Step 1 — pass directly, do not serialize again>",
"operationId": ""
}
Step 3 - flowElementGeneration (call in a loop):
{
"operationId": "<operationId from Step 2>",
"requestSource": "A4V"
}
Call repeatedly with the same operationId until isComplete is true or errors are returned. A flow can have any number of elements, so expect multiple iterations. When isComplete is true, extract the flow metadata from the result field. Use "requestSource": "A4V" to get flow metadata in XML format.
Failure to follow this checklist exactly will result in broken or missing flow metadata.
<label>, <description>, or any other node). The final XML must be identical to what the pipeline returned. Exception: if the user explicitly requested fixes to validation/deployment errors in already-generated XML, targeted manual edits are permitted.userPrompt each), holds the flow requirements (NOT inflightMetadata), and is passed identically to Step 1 and Step 2."[]"), is [] when no custom objects are needed, and otherwise holds structured object/field metadata scanned from the local sfdx project — never text descriptions.operationId from Step 2, requestSource always "A4V", until isComplete is true or errors are returned — no pausing, no asking the user to continue, no matter how many iterations. Extract the XML from result only when isComplete is true.原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。