| name | shortcuts-generator |
| description | Generate macOS/iOS Shortcuts by creating .shortcut plist files. Use when asked to create, build, or generate Shortcuts, automate iOS/macOS workflows, or produce .shortcut files. |
Shortcuts Generator
Generate valid .shortcut plist files that can be signed and imported into Apple Shortcuts.
Workflow
- Build the plist XML with actions, UUIDs, and variable references
- Write to
<Name>.shortcut
- Sign:
shortcuts sign --mode anyone --input <Name>.shortcut --output <Name>_signed.shortcut
- The signed file can be opened/imported into Shortcuts.app
Quick Reference
Plist Structure
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>WFWorkflowActions</key>
<array></array>
<key>WFWorkflowClientVersion</key><string>2700.0.4</string>
<key>WFWorkflowMinimumClientVersion</key><integer>900</integer>
<key>WFWorkflowMinimumClientVersionString</key><string>900</string>
<key>WFWorkflowIcon</key>
<dict>
<key>WFWorkflowIconGlyphNumber</key><integer>59511</integer>
<key>WFWorkflowIconStartColor</key><integer>4282601983</integer>
</dict>
<key>WFWorkflowHasOutputFallback</key><false/>
<key>WFWorkflowImportQuestions</key><array/>
<key>WFWorkflowOutputContentItemClasses</key><array/>
<key>WFWorkflowTypes</key><array/>
<key>WFWorkflowName</key><string>My Shortcut</string>
</dict>
</plist>
Action Structure
<dict>
<key>WFWorkflowActionIdentifier</key>
<string>is.workflow.actions.showresult</string>
<key>WFWorkflowActionParameters</key>
<dict>
<key>UUID</key>
<string>A1B2C3D4-E5F6-7890-ABCD-EF1234567890</string>
</dict>
</dict>
Variable References
Source action needs a UUID. Consumer references it via OutputUUID in attachmentsByRange.
Placeholder char:  (U+FFFC). Range format: {position, 1}.
<key>Text</key>
<dict>
<key>Value</key>
<dict>
<key>attachmentsByRange</key>
<dict>
<key>{0, 1}</key>
<dict>
<key>OutputName</key><string>Text</string>
<key>OutputUUID</key><string>SOURCE-UUID</string>
<key>Type</key><string>ActionOutput</string>
</dict>
</dict>
<key>string</key><string></string>
</dict>
<key>WFSerializationType</key><string>WFTextTokenString</string>
</dict>
Single variable (no text): use WFTextTokenAttachment instead of WFTextTokenString.
Control Flow
GroupingIdentifier: UUID linking start/middle/end
WFControlFlowMode: <integer>0</integer>=start, 1=middle (else/case), 2=end
- Must be
<integer>, not <string>
- Repeat:
is.workflow.actions.repeat.count / repeat.each
- Conditional:
is.workflow.actions.conditional
- Menu:
is.workflow.actions.choosefrommenu
Common Actions
| Action | Identifier | Key Params |
|---|
| Text | gettext | WFTextActionText |
| Show Result | showresult | Text |
| Ask Input | ask | WFAskActionPrompt, WFInputType |
| AI/LLM | askllm | WFLLMPrompt, WFLLMModel, WFGenerativeResultType |
| URL | url | WFURLActionURL |
| HTTP Request | downloadurl | WFURL, WFHTTPMethod, WFHTTPBodyType |
| Open App | openapp | WFAppIdentifier |
| Alert | alert | WFAlertActionTitle, WFAlertActionMessage |
| Find Photos | filter.photos | WFContentItemFilter |
| Delete Photos | deletephotos | photos (NOT WFInput) |
| Shell Script | runshellscript | script text |
| Current Weather | weather.currentconditions | (none) |
All identifiers prefixed with is.workflow.actions..
Key Rules
- UUIDs must be uppercase
WFControlFlowMode is an integer
- Range keys:
{position, length} — length is always 1
 (U+FFFC) marks variable insertion points
- Every control flow start needs a matching end with same
GroupingIdentifier
- Screenshots filter: use
Is a Screenshot boolean, NOT Media Type = Screenshot
- Delete photos param is
photos (lowercase), not WFInput
Messages Actions
Find Message uses com.apple.MobileSMS.MessageEntity via appintentexecution:
<dict>
<key>WFWorkflowActionIdentifier</key>
<string>is.workflow.actions.appintentexecution</string>
<key>WFWorkflowActionParameters</key>
<dict>
<key>AppIntentDescriptor</key>
<dict>
<key>BundleIdentifier</key><string>com.apple.MobileSMS</string>
<key>Name</key><string>Find Message</string>
<key>AppIntentIdentifier</key><string>MessageEntity</string>
</dict>
<key>WFContentItemFilter</key>
<key>WFContentItemSortProperty</key><string>date</string>
<key>WFContentItemSortOrder</key><string>Latest First</string>
</dict>
</dict>
Message properties: body, sender, date, conversation, isUnread, attachments, links.
Note: INSearchForMessagesIntent is deprecated. Use MessageEntity instead.
Detailed References
For complete docs on specific topics, read these files in this skill directory:
PLIST_FORMAT.md — Full plist structure and root keys
ACTIONS.md — All 427 WF*Action identifiers and parameters
APPINTENTS.md — All 728 AppIntent actions
MESSAGES.md — Messages/iMessage actions (Find Message, Find Conversation, Send Reply, etc.)
PARAMETER_TYPES.md — All parameter value types and serialization
VARIABLES.md — Variable reference system and aggrandizements
CONTROL_FLOW.md — Repeat, Conditional, Menu patterns
FILTERS.md — Content filters for Find/Filter actions
EXAMPLES.md — Complete working examples
Only read these when you need details beyond what's in this file.