Workflow Runner

Scenario workflows

by scenario-labs · MIT license · ★ 854 on GitHub

Scenario workflows cover

Use when a task involves running a Scenario workflow through MCP, including anything the user calls a Scenario app, a saved pipeline, or a multi-step generation graph. Triggers include listing workflows, building workflow_run's inputs…

---
name: scenario-workflows
description: "Use when a task involves running a Scenario workflow through MCP, including anything the user calls a Scenario app, a saved pipeline, or a multi-step generation graph. Triggers include listing workflows, building workflow_run's inputs object, pricing a run with a dry run, approving or rejecting a stuck approval node, a run rejected for input length, or a workflows_list reply flooding the context. Creating or editing graphs is scenario-workflow-authoring. Keywords: workflow, app, approval gate."
license: MIT
---

# Scenario Workflows

## Overview

A Scenario workflow is a saved node graph chaining several models into one call; users say "app" and mean one whose status is `ready`. `workflow_run` returns a job tracked like any other generation.

Only `workflows_list`, `workflow_get` and `workflow_run` are listed by default; approve and reject run through `scenario_tools_search` plus their executor lane. Connection and the core loop: the `scenario` skill. Creating, editing and publishing graphs: the `scenario-workflow-authoring` skill. If a sibling skill named here is missing from your available skills, ask the user to install it (`npx skills add scenario-labs/skills --skill <name>`); unattended, proceed from tool schemas and flag the gap.

## Quick reference

| Step                  | Call                                              | Notes                          |
| --------------------- | ------------------------------------------------- | ------------------------------ |

Overview

A Scenario workflow is a saved node graph chaining several models into one call; users say "app" and mean one whose status is ready. workflow_run returns a job tracked like any other generation.

Manual install (npx, ZIP)
Claude Codenpx skills add scenario-labs/skills --skill scenario-workflows -g -a claude-code
Claude Code (degit)npx degit scenario-labs/skills/skills/scenario-workflows#main ~/.claude/skills/scenario-workflows
Claude.ai / desktopZip the folder and upload it under Settings → Capabilities → Skills.
Codex, Cursor, other agentsPoint them at SKILL.md. The other files are plain text.

Connects with Agent Alley MCP · agentalley.io/mcp

Files included

  • SKILL.md7.5 KB
Read SKILL.md here
scenario-labs/main1 file shown
SKILL.md
Show the full text60 lines

Scenario Workflows

Overview

A Scenario workflow is a saved node graph chaining several models into one call; users say "app" and mean one whose status is ready. workflow_run returns a job tracked like any other generation.

Only workflows_list, workflow_get and workflow_run are listed by default; approve and reject run through scenario_tools_search plus their executor lane. Connection and the core loop: the scenario skill. Creating, editing and publishing graphs: the scenario-workflow-authoring skill. If a sibling skill named here is missing from your available skills, ask the user to install it (npx skills add scenario-labs/skills --skill <name>); unattended, proceed from tool schemas and flag the gap.

Quick reference

Step Call Notes
1. List workflows_list status="ready" Always cap limit
2. Read the contract list inputs[], get workflow.inputs_definition name is the run key
3. Price and validate workflow_run with dry_run=true Returns cost, creates no job
4. Run workflow_run with inputs Returns a job
5. Wait jobs_wait Re-call with pending_job_ids

Ids are prefixed wflow_; copy them from workflows_list or search, never construct them. For a named app or a public template, call search with target="workflows", a keyword query, limit=3, and your scope; add public=true for the public catalog. Workflows support keyword text and filters, not image or semantic search. To find ready apps, add the raw filter: 'status = "ready"' (not filters.status). Read hits from workflows, then call workflow_get on the chosen id and read the contract from workflow.inputs_definition: search summaries contain neither the run inputs nor the editable graph. Search uses offset, not page_token; heed any _hint on an empty page instead of repeating the same search.

Cap every list call

Each record carries the compiled flow and the whole editorInfo node graph, and the tool exposes no compact flag: the two fields made up three quarters of the bytes in live records, which ran from about 1,900 to 22,000 characters, and a draft with flow: [] still ships its editorInfo. Cap limit at 3 or fewer, read only id, name, hasFlow and inputs, and page with page_token set to the previous reply's nextPaginationToken, absent on the last page. The tool schema advertised a ceiling of 200 at authoring time while the API rejects anything past 100 with a 400 naming pageSize and the range [1; 100], so the schema's maximum is not a value to send.

Only draft and ready filter server-side; other statuses filter each page client-side (flagged _workflowListStatusFilter); there an empty page beside a nextPaginationToken means keep paging.

The input contract

workflow_run's inputs object is keyed by inputs[].name, taken verbatim from the record. Each name is the id of the node behind it, so names can be positional (text2, text3), neither contiguous nor ordered.

  • label and description carry the human intent, not the key.
  • Never harvest keys from editorInfo.nodes[].data.name; node names go stale.
  • required is an object: test required.always === true, a truthiness check reads {"always": false} as required too.
  • Inputs are typed: string, file, file_array, string_array, more. file takes an asset id (upload first). Match the type: the API drops scalar-for-array mismatches silently and still charges; workflow_run wraps simple scalars into arrays, but only simple ones.
  • inputs[] is not the whole contract: a string input inherits the length ceiling of the node behind it (a model's own prompt cap, observed as low as 4000 characters), which the record never lists and which surfaces only at run time as a 400 quoting the cap but not the input key. The dry run enforces the same validator at zero cost: route long texts through dry_run=true and shorten to fit rather than retrying verbatim, and with several string inputs bisect with dry runs to find the offender.
  • workflow_get wraps inputs_definition/editor_info in workflow; workflows_list wraps inputs/editorInfo in workflows.

Worked example: run a saved app

  1. workflows_list with status="ready", limit=3, plus team_id and project_id. Read id, name and inputs off each record; ignore flow and editorInfo.
  2. An inputs[] entry {"name": "text1", "required": {"always": false}} runs with {"text1": "..."}.
  3. workflow_run with workflow_id, dry_run=true, and the full inputs object. The reply is creativeUnitsCost, creativeUnitsDiscount and an empty job; quote the cost first. It also runs the real validator.
  4. Repeat without dry_run, then jobs_wait on the returned job, re-calling with pending_job_ids while it runs.
  5. asset_display each output asset, one per id.

Common mistakes

  • Guessing input keys from labels or the node graph instead of reading inputs[].
  • Skipping the dry run: two of three ready workflows failed its validation with correctly named inputs; report that error, not the payload.
  • Reading cost or attribution off the parent job: a finished workflow job bills cuCost: 0 and lists assetIds with no per-model attribution. Every node ran as its own child job carrying the real cuCost (together they equal the dry-run quote, except inside a forEach loop, whose dry run prices one iteration), and job_get verbose=true on the workflow job returns metadata.flow mapping each node to its child jobId, modelId and output asset ids.
  • Sending a batch through a file_array input and expecting one output per item: whether the app loops is in its graph, not its inputs. Look for a forEach node ahead of the model in editorInfo (for-each in the compiled flow; the workflows_list record carries both, or workflow_get); without one, the app makes one generation from all the items, so call workflow_run once per item (each its own dry run and job). A looping app's dry run prices one iteration, so multiply its quote by the item count.
  • Running a draft: flow: [] and hasFlow: false while inputs looks complete. Publishing: see scenario-workflow-authoring.
  • Calling workflow_approve or workflow_reject without all three of workflow_id, workflow_job_id and node_id: the gate is per node; a parked run never finishes on its own. Find the run with jobs_list, read it with job_get verbose=true (compact replies omit metadata): metadata.flow lists per-node statuses, the pending approval node's id is node_id, the job's id is workflow_job_id, its workflowId the workflow_id. Reject cancels the run.
1---
2name: scenario-workflows
3description: "Use when a task involves running a Scenario workflow through MCP, including anything the user calls a Scenario app, a saved pipeline, or a multi-step generation graph. Triggers include listing workflows, building workflow_run's inputs object, pricing a run with a dry run, approving or rejecting a stuck approval node, a run rejected for input length, or a workflows_list reply flooding the context. Creating or editing graphs is scenario-workflow-authoring. Keywords: workflow, app, approval gate."
4license: MIT
5---
6 
7# Scenario Workflows
8 
9## Overview
10 
11A Scenario workflow is a saved node graph chaining several models into one call; users say "app" and mean one whose status is `ready`. `workflow_run` returns a job tracked like any other generation.
12 
13Only `workflows_list`, `workflow_get` and `workflow_run` are listed by default; approve and reject run through `scenario_tools_search` plus their executor lane. Connection and the core loop: the `scenario` skill. Creating, editing and publishing graphs: the `scenario-workflow-authoring` skill. If a sibling skill named here is missing from your available skills, ask the user to install it (`npx skills add scenario-labs/skills --skill <name>`); unattended, proceed from tool schemas and flag the gap.
14 
15## Quick reference
16 
17| Step | Call | Notes |
18| --------------------- | ------------------------------------------------- | ------------------------------ |
19| 1. List | `workflows_list` `status="ready"` | Always cap `limit` |
20| 2. Read the contract | list `inputs[]`, get `workflow.inputs_definition` | `name` is the run key |
21| 3. Price and validate | `workflow_run` with `dry_run=true` | Returns cost, creates no job |
22| 4. Run | `workflow_run` with `inputs` | Returns a job |
23| 5. Wait | `jobs_wait` | Re-call with `pending_job_ids` |
24 
25Ids are prefixed `wflow_`; copy them from `workflows_list` or `search`, never construct them. For a named app or a public template, call `search` with `target="workflows"`, a keyword `query`, `limit=3`, and your scope; add `public=true` for the public catalog. Workflows support keyword text and filters, not image or semantic search. To find ready apps, add the raw `filter: 'status = "ready"'` (not `filters.status`). Read hits from `workflows`, then call `workflow_get` on the chosen id and read the contract from `workflow.inputs_definition`: search summaries contain neither the run inputs nor the editable graph. Search uses `offset`, not `page_token`; heed any `_hint` on an empty page instead of repeating the same search.
26 
27## Cap every list call
28 
29Each record carries the compiled `flow` and the whole `editorInfo` node graph, and the tool exposes no compact flag: the two fields made up three quarters of the bytes in live records, which ran from about 1,900 to 22,000 characters, and a draft with `flow: []` still ships its `editorInfo`. Cap `limit` at 3 or fewer, read only `id`, `name`, `hasFlow` and `inputs`, and page with `page_token` set to the previous reply's `nextPaginationToken`, absent on the last page. The tool schema advertised a ceiling of 200 at authoring time while the API rejects anything past 100 with a 400 naming `pageSize` and the range [1; 100], so the schema's maximum is not a value to send.
30 
31Only `draft` and `ready` filter server-side; other statuses filter each page client-side (flagged `_workflowListStatusFilter`); there an empty page beside a `nextPaginationToken` means keep paging.
32 
33## The input contract
34 
35`workflow_run`'s `inputs` object is keyed by `inputs[].name`, taken verbatim from the record. Each name is the id of the node behind it, so names can be positional (`text2`, `text3`), neither contiguous nor ordered.
36 
37- `label` and `description` carry the human intent, not the key.
38- Never harvest keys from `editorInfo.nodes[].data.name`; node names go stale.
39- `required` is an object: test `required.always === true`, a truthiness check reads `{"always": false}` as required too.
40- Inputs are typed: `string`, `file`, `file_array`, `string_array`, more. `file` takes an asset id (upload first). Match the type: the API drops scalar-for-array mismatches silently and still charges; `workflow_run` wraps simple scalars into arrays, but only simple ones.
41- `inputs[]` is not the whole contract: a string input inherits the length ceiling of the node behind it (a model's own prompt cap, observed as low as 4000 characters), which the record never lists and which surfaces only at run time as a 400 quoting the cap but not the input key. The dry run enforces the same validator at zero cost: route long texts through `dry_run=true` and shorten to fit rather than retrying verbatim, and with several string inputs bisect with dry runs to find the offender.
42- `workflow_get` wraps `inputs_definition`/`editor_info` in `workflow`; `workflows_list` wraps `inputs`/`editorInfo` in `workflows`.
43 
44## Worked example: run a saved app
45 
461. `workflows_list` with `status="ready"`, `limit=3`, plus `team_id` and `project_id`. Read `id`, `name` and `inputs` off each record; ignore `flow` and `editorInfo`.
472. An `inputs[]` entry `{"name": "text1", "required": {"always": false}}` runs with `{"text1": "..."}`.
483. `workflow_run` with `workflow_id`, `dry_run=true`, and the full `inputs` object. The reply is `creativeUnitsCost`, `creativeUnitsDiscount` and an empty `job`; quote the cost first. It also runs the real validator.
494. Repeat without `dry_run`, then `jobs_wait` on the returned job, re-calling with `pending_job_ids` while it runs.
505. `asset_display` each output asset, one per id.
51 
52## Common mistakes
53 
54- Guessing input keys from labels or the node graph instead of reading `inputs[]`.
55- Skipping the dry run: two of three ready workflows failed its validation with correctly named inputs; report that error, not the payload.
56- Reading cost or attribution off the parent job: a finished workflow job bills `cuCost: 0` and lists `assetIds` with no per-model attribution. Every node ran as its own child job carrying the real `cuCost` (together they equal the dry-run quote, except inside a `forEach` loop, whose dry run prices one iteration), and `job_get` `verbose=true` on the workflow job returns `metadata.flow` mapping each node to its child `jobId`, `modelId` and output asset ids.
57- Sending a batch through a `file_array` input and expecting one output per item: whether the app loops is in its graph, not its inputs. Look for a `forEach` node ahead of the model in `editorInfo` (`for-each` in the compiled `flow`; the `workflows_list` record carries both, or `workflow_get`); without one, the app makes one generation from all the items, so call `workflow_run` once per item (each its own dry run and job). A looping app's dry run prices one iteration, so multiply its quote by the item count.
58- Running a draft: `flow: []` and `hasFlow: false` while `inputs` looks complete. Publishing: see `scenario-workflow-authoring`.
59- Calling `workflow_approve` or `workflow_reject` without all three of `workflow_id`, `workflow_job_id` and `node_id`: the gate is per node; a parked run never finishes on its own. Find the run with `jobs_list`, read it with `job_get` `verbose=true` (compact replies omit `metadata`): `metadata.flow` lists per-node statuses, the pending approval node's id is `node_id`, the job's id is `workflow_job_id`, its `workflowId` the `workflow_id`. Reject cancels the run.
60 
View all files on GitHub →

Details

License
MIT
Stars on the repo
★ 854
Checked
Source
scenario-labs/skills ↗
Creator
scenario-labs · 10 listings
View creator

Similar skills

See all →
SkillBrowser Automationruvnet/RuView · by ruvnetWeb browser automation with AI-optimized snapshots for claude-flow agents★ 94.7k GitHub starsSkillDeepeval LLM Assessmentconfident-ai/deepeval · by confident-aiDeepEval evaluation workflow for AI agents and LLM applications. TRIGGER when the user wants to evaluate or improve an AI agent, tool-using workflow, multi-turn chatbot, RAG pipeline, or LLM app; add evals; generate datasets or goldens; use deepeval generate; use deepeval test run; send results to Confident AI; monitor production; run online evals; inspect traces; or iterate on prompts, tools, retrieval, or agent behavior from eval failures. AI agents are the primary use case. Covers Python SDK, pytest eval suites, CLI generation, traced evals, Confident AI reporting, and agent-driven improvement loops. DO NOT TRIGGER for unrelated generic pytest, non-AI test setup, or non-DeepEval observability work unless the user asks to compare or migrate to DeepEval; for instrumenting an app with DeepEval tracing, @observe, or framework integrations (use the `deepeval-tracing` skill); or for raw OpenTelemetry / OTLP export without the deepeval package (use the `deepeval-otel` skill).★ 18.7k GitHub starsSkillBrowser Automation ToolSawyerHood/dev-browser · by SawyerHoodBrowser automation with persistent named pages via the dev-browser CLI. Use when users ask to navigate websites, fill forms, take screenshots, extract web data, test web apps, log into sites, or automate browser workflows. Trigger phrases include "go to [url]", "click on", "fill out the form", "take a screenshot", "scrape", "automate", "test the website", "log into", "open the browser", or any browser interaction request.★ 6.7k GitHub starsSkillSkill to App ConverterBuilderIO/skills · by BuilderIOTurn visible project context, a proven thread, skill, or workflow into a runnable Agent-Native app with simple buttons, visible agent steps, preview, and deployment handoff. Use when a user invokes `/turn-into-app` or asks to make a workflow into an app, including from Claude or ChatGPT on the web, including when the source is a spreadsheet link or upload.★ 4.5k GitHub starsSkillBrowser Test Automationlackeyjb/playwright-skill · by lackeyjbComplete browser automation with Playwright. Auto-detects dev servers, writes reusable test scripts, and supports screenshots, responsive checks, UX validation, login flows, link checks, and arbitrary browser automation. Use when the user wants to test a website, automate browser interactions, validate web functionality, or perform browser-based testing.★ 3.2k GitHub starsSkillTinyFish CLItinyfish-io/tinyfish-cookbook · by tinyfish-ioUse TinyFish for web search, fetching URLs, reading pages, current information, source-backed answers, research, docs, pricing/product pages, extraction, scraping, and browser automation. Use whenever the user asks to search, find, look up, research, compare, get information from the web, summarize a URL, fetch page content, or automate a website.★ 2.2k GitHub stars

More from scenario-labs

SkillScenario Asset Platformscenario-labs/skills · by scenario-labsUse when connecting an AI agent to Scenario (scenario.com) through MCP, or when a task involves generating images, video, 3D, audio, sprites, textures, or game assets. Also when picking a Scenario model, running a LoRA, refining a generation prompt, uploading reference images, waiting on generation jobs, checking credits or quota, hitting Scenario auth, scope, or Forbidden errors, or setting up mcp.scenario.com in Claude Code, Cursor, VSCode, or another agent.★ 854 GitHub starsSkill3D Asset Generatorscenario-labs/skills · by scenario-labsUse when generating or handling 3D assets through the Scenario MCP server, including text-to-3D or image-to-3D meshes, GPT-6 Astra 3D or Claude Opus 5.5 3D, GLB, FBX, OBJ, STL, or VOX files, PBR-textured or game-ready models, voxel models, multi-view reconstruction, retexture, remesh, UV unwrap, auto-rigging a biped or quadruped, or retargeting an animation, previewing a mesh in the inline 3D viewer, or downloading a model for import into Unity, Unreal, Godot, or Blender.★ 854 GitHub starsSkillGame Asset Generatorscenario-labs/skills · by scenario-labsUse when creating game art through Scenario MCP: sprites, sprite sheets, icons, props, loot, tilesets and autotile terrain transitions, seamless tiles, isometric buildings, top-down maps, pixel art, UI buttons and panels, parallax background layers or depth planes for side-scrollers, and character or concept art; or when assets need transparent backgrounds, background removal, style-consistent variation batches, upscaling, pixel-grid cleanup, or PNG export for Unity, Godot, or Unreal.★ 854 GitHub starsSkillGPT Image Generatorscenario-labs/skills · by scenario-labsUse when generating or editing images with OpenAI's GPT Image models on Scenario via MCP: text-to-image, edits from reference images, inpainting with an alpha mask, in-image text for logos and infographics, transparent cutouts, pixel sizing up to 4K, quality tiers up to xhigh and max, input fidelity for product or face detail, or choosing between Flare, Sunburst, GPT Image 2 and 1.5. Keywords: GPT Image 2.5, GPT Image 2, OpenAI, DALL-E, gpt-image, ChatGPT image, txt2img, img2img, background.★ 854 GitHub starsSkillIdeogram Image Creatorscenario-labs/skills · by scenario-labsUse when generating or editing images with Ideogram models on Scenario via MCP: posters, logos, menus, packaging, or signage with exact in-image text, editing an image in place while keeping its exact size, transparent PNG generation, background removal that keeps hair and glass edges, editable text layers for localization, or one consistent character from a reference. Keywords: Ideogram 4.5, Precise Edit, V4, V3, typography, aspect ratio, layerize, character reference, inpainting.★ 854 GitHub starsSkillSeedance Video Generatorscenario-labs/skills · by scenario-labsUse when generating or editing video with Seedance models on Scenario via MCP: text-to-video, image-to-video from a first frame, first and last frame anchors, reference-to-video with identity, product, or world references, prompt-based editing, extending a clip, audio-conditioned motion or a reference voice, shot sound without music, or deciding between first-frame and reference conditioning. Keywords: Seedance 2.5 and 2.0, ByteDance, T2V, I2V, V2V, multimodal references, native audio, video extension.★ 854 GitHub stars