plugins/creative-cloud/run-workflow/skills/run-workflow/SKILL.md
Use the run-workflow MCP to discover, compose, execute, publish, and save Adobe Firefly workflows. TRIGGER when: user asks what actions are available, what the MCP can do, how to process images/video/3D via workflow, wants to build/run/save/publish a workflow, OR pastes any workflow/batch/execution ID. BARE ID (UUID/workflowId/batchId) = INSPECT ONLY — call inspect_run, NEVER run_workflow_submit. ALWAYS call list_actions first for capability/discovery questions. DO NOT TRIGGER for direct Firefly API calls without MCP (use firefly-api-specs).
npx skillsauth add adobe/skills run-workflowInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Discover, compose, run, publish, and save Adobe Firefly workflows through the run-workflow MCP
server. Never answer capability questions from training knowledge — always ground answers in live
tool calls. list_actions is ALWAYS the first call for any capability/discovery question.
This file is the always-loaded core. Deeper procedures live in references/ and should be read
only when the current turn needs them:
| Read this reference when… | File |
| --- | --- |
| User names a featured workflow, or supplies a custom .indd template to rewire | references/featured-and-templates.md |
| Composing a non-trivial graph, wants multi-variant outputs, or a required input is missing | references/compose.md |
| Inspecting a run, listing history, or a workflow failed (error tables, inspect_run routing) | references/diagnostics.md |
| Uploading files, resolving inline pastes, macOS permission error, saving outputs | references/asset-input.md |
| User asks for alert triage / RCA (dev-only: login --dev, Splunk + Slack) | references/alert-rca.md |
When the skill argument is just an ID (UUID, workflowId, batchId, executionId) with no other context, the intent is ALWAYS to inspect — NEVER to execute.
inspect_run(id) immediately.run_workflow_submit as a follow-up."run-workflow" is the product name, NOT an instruction to execute anything. Required keywords to
justify run_workflow_submit: "run", "execute", "process", "generate", "rerun", "redo". If NONE
appear in the user's message, call inspect_run.
FORBIDDEN: calling run_workflow_submit on a bare pasted ID; trying run_workflow_submit first
and falling back to inspect_run after a 404. For rerun-after-inspect handling by canRerun, see
references/diagnostics.md.
TRIGGER when the user: asks what actions/capabilities exist; wants to process images/video/3D
through a Firefly workflow; wants to build/compose/execute a workflow; asks about past runs or
history; pastes any run-workflow ID (→ inspect_run); asks "why did my workflow fail"; wants to
publish a workflow as an API; wants to save a workflow to Workflow Builder.
DO NOT TRIGGER when: the user wants to call the Firefly REST API directly without MCP (use
firefly-api-specs); the user is building/debugging the run-workflow server itself.
| User intent | Tool |
| --- | --- |
| "What actions are available?" / "What can this MCP do?" / "Show me the catalog" | list_actions |
| "What parameters does action X accept?" | get_action_schema |
| "Build / compose / create a workflow for…" | compose_workflow |
| Upload a local file to get a URL | upload_asset |
| Execute a workflow — only with explicit run/execute keywords. Returns a batchId immediately (async); safe for any size | run_workflow_submit |
| Check whether a running execution is done — always pass includeOutputs: true on every poll | run_workflow_get_status |
| Abort a running batch by batchId | cancel_workflow |
| "List my workflows" / "Show my recent runs" (multiple) | list_workflow_history |
| "Last workflow I ran" / "Most recent run" (single, by recency) | list_workflow_history (limit=1) → inspect_run |
| Per-action outputs/logs/errors for a run; "why did it fail?"; any pasted ID | inspect_run |
| Look up known-good examples to debug a failed compose | get_workflow_examples |
| Reload examples after editing JSON files on disk | reload_examples |
| Publish workflow as a reusable API endpoint with curl | publish_workflow |
| Save workflow to user's ACP cloud / Workflow Builder UI | save_workflow_to_acp |
| Generate a curl command for a published workflowId | generate_curl |
| Display output images inline in chat | display_asset |
| See newly registered actions (catalog stale) | refresh_catalog |
| Run a named/featured workflow (retargeting, banners, localization, packaging…) | get_featured_workflow → see references/featured-and-templates.md |
Single vs. multiple: one ID / "the last one" / "that workflow" → inspect_run (full details).
A list/history request with no named target → list_workflow_history (summaries only). See
references/diagnostics.md.
1. upload_asset — upload local files; get back URLs for use as inputs
1b. get_action_schema — if you can identify 1–3 target action types, fetch schemas BEFORE
composing and inject them into the compose message (see references/compose.md).
Skip for simple/obvious single-action workflows.
2. compose_workflow — describe the desired processing in natural language; the AI graph agent
designs the graph. DO NOT manually specify actions or connections.
3. run_workflow_submit — execute with inputs; pass session_id from step 2. Pass ALL images in ONE
call. Returns a batchId immediately (async); does NOT block on completion.
4. run_workflow_get_status — poll the batchId; ALWAYS pass includeOutputs: true. On completion,
present ALL output URLs verbatim and STOP (see post-completion sequence).
5. download_output — ONLY after the user asks; saveTo a folder they choose.
6. publish_workflow — publish for API reuse OR save_workflow_to_acp — save for UI editing.
CRITICAL — Presigned URLs must NEVER be retyped or reconstructed. Azure SAS / AWS S3 presigned
URLs are HMAC-signed over every character. Changing one character invalidates the signature
(asset_download_failed). Always copy url fields verbatim from responses.
After run_workflow_submit, poll run_workflow_get_status every ~5s with includeOutputs: true
(the server short-circuits the flag while running — zero extra cost). Report progress using
elapsedSeconds and percentage from the response directly — do not estimate elapsed time
yourself:
Running — 3/10 assets complete (30%) · 45s elapsed
downloadedPreviewOutputs, display those immediately (labelled in-progress)
while continuing to poll.status === "completed", outputs are already in the response — no second call. Responses are
slim by default; pass includeProvenance: true only if you need the full per-node asset tree.status === "failed", call inspect_run on the failed execution, summarize, and stop — do
not auto-retry or re-wire. See references/diagnostics.md.For output extraction paths and inline-display rules, see
references/asset-input.md.
Once run_workflow_get_status reports completed, run these steps in order, one message each,
each gated on the user's reply. Never merge them or skip ahead.
[presigned URL] is forbidden). URLs expire in ~1 hour. Group
terminal outputs under Final outputs, pipeline artifacts under Intermediate outputs. For
featured workflows, surface the merge-data banners (1080×1080, 300×600, etc.) as Final outputs.
Nothing else in this message — no download/save/publish offer.download_output with their chosen saveTo and report the exact saved paths.save_workflow_to_acp), publish as an API
(publish_workflow), or start a new workflow.compose_workflow and get_featured_workflow both return one. Retain it for the
whole conversation; pass it to run_workflow_submit, publish_workflow, save_workflow_to_acp
instead of re-serializing actions/connections. The server holds it for 2 hours.run_workflow_submit call (use the
content array on the input node). Never make separate calls per image.publish_workflow creates a reusable API endpoint (workflowId + curl):
use for "publish", "make it callable", "create an API". save_workflow_to_acp saves to the user's
Adobe cloud for Workflow Builder: use for "save", "keep editing", "open in the UI". If ambiguous,
ask before proceeding.inspect_run for a single item; list_workflow_history for lists. Never read local
workflow.json/inputs.json. Details in references/diagnostics.md.references/compose.md.list_actions.get_action_schema context (see compose.md).compose_workflow — describe intent in natural language.run_workflow_submit calls per image — pass all inputs in one call.list_workflow_history/inspect_run are authoritative.run_workflow_submit on a bare pasted ID — inspect, present, stop.display_asset exceeds the 1MB cap) — present
text URLs; use download_output with saveTo to save locally.firefly-api-specs (not included in this plugin)references/ (featured-and-templates, compose, diagnostics,
asset-input, alert-rca).tools
Run predefined featured workflows via run-workflow MCP. TRIGGER when user names a featured workflow (retargeting, banners at scale, localization, packaging, banner advertising, etc.) or asks to run a known marketing/production workflow. Requires run-workflow MCP. ALWAYS call get_featured_workflow before compose_workflow. DO NOT TRIGGER for custom one-off workflows with no named template — use run-workflow skill.
tools
Migrate an Adobe Commerce App Builder project from the Integration Starter Kit or Checkout Starter Kit to the new App Management approach. Run from the root of the App Builder project to be migrated. Pass --auto to skip confirmation prompts (suitable for CI or batch use) — auto mode prints a summary of all Q&A questions answered with their defaults. Pass --doc-scan-only to scan README.md and env.dist for outdated content without modifying any files. Use when the user wants to migrate an App Builder project from the Integration Starter Kit or Checkout Starter Kit to the App Management approach, or mentions upgrading their Adobe Commerce extension architecture.
development
Add or modify webhook interceptors in an Adobe Commerce app. Use when the user wants to intercept Commerce operations to validate input, append data, or modify behavior — before or after execution. Requires a base app initialized with commerce-app-init.
development
Integrate App Builder Database Storage (@adobe/aio-lib-db) into an Adobe Commerce app and scaffold a runtime action that reads and writes documents. Use when the user wants persistent, queryable storage backing a Commerce app — either from a web action (HTTP-invokable) or from an event/webhook handler. Requires a base app initialized with commerce-app-init.