| name | storyboard-intro |
| description | First-time orientation — the 5 user intents + canonical Wave 2/3 verbs |
| agent_rule | On cold-start or 'what can you do', orient by the 5 user intents — don't enumerate 40 tools. |
| task | ["narrate"] |
| domain | ["story"] |
| persona | ["agent-only"] |
| scope | episode |
| category | onboarding |
| triggers | ["first time","getting started","what can you do","new user","/intro"] |
Storyboard MCP — orient the user (Wave 3 surface)
The Storyboard MCP exposes ~99 tools spanning image / video / audio generation, brand kits, moodboards, LoRA training, an agent marketplace, finishing, and social publishing via Publora. A new user shouldn't see 99 options — orient by the 5 intents below (or attach get-started-mcp).
The five user intents you'll see most
Intent 1 — "Make me an image / video / audio of X"
→ create_media({ action: "generate", prompt: "..." }) — server picks the right cap.
Wave 3 prefer_fast routing — pass prefer_fast: true when wall-clock matters more than fidelity (chat preview, real-time iteration, draft moodboards). Routes generate → flux-schnell (~2s) and animate → seedance-i2v-fast. The premium default (flux-dev, ~30s) stays in place when prefer_fast is omitted.
Polymorphic actions (Wave 2): action is one of generate | animate | music | tts | mux_audio | lipsync | subtitle | upscale. Pass the appropriate fields (audio_url for mux/lipsync, text for tts/subtitle, source_url for animate/upscale).
Symbolic source refs (Wave 2 E1): pass source_url: "@last" / "@last_image" / "@last_video" / "@last_audio" to chain on the most-recent asset without re-pasting the URL.
Intent 2 — "Build me a moodboard for the [brand X] launch"
Wave 3 fast path — saved templates. If the user's brief matches a canonical flow, this is one MCP call:
list_templates() → see the library: launch_campaign / rebrand_exploration / competitive_moodboard / press_kit / thought_leadership / community_garden
apply_template({ template_id, variables: {product, audience, ...}, context_kit_id? }) → creates the moodboard + returns a pre-filled moodboard_spread invocation in next_actions
- Confirm cost via
confirm: false (dry-run), then run
Manual path (when no template fits):
brand_kit_create({ name, palette: ["#RRGGBB", ...], prompt_keywords: [...] })
moodboard_create({ title, intent, context_kit_id })
moodboard_spread({ moodboard_id, count: 12, confirm: false }) to preview cost
moodboard_spread({ ... }) (no confirm) to fire
Active brand kit sticky (D3): call set_active_brand_kit({ kit_id }) once at the start; every subsequent create_media / generate_project for the next hour inherits palette + keywords automatically. Clear with clear_active_brand_kit().
Intent 3 — "Place this product photo in 6 different scenes"
→ place_subject({ source_url, count: 6 }) — subject-transfer through nano-banana (Imagen Edit). One call, parallel render. ~$0.20. Use confirm: false for the dry-run preview first.
Intent 4 — "Vary / iterate on a specific image"
The canonical Wave 2 verb: create_variations({ source_url, count: 4, mode: "mixed" }). Modes: seed (low drift) / prompt (style shifts) / model (cross-model range) / mixed (the default blend).
Single-slot refinement on a moodboard tile: refine_slot({ moodboard_id, slot_id: "slot-3", hint: "warmer" }). The prior version is pushed to slot.history[] (max 5) and shows up in the viewer's alternatives rail.
Intent 5 — "Publish what we just made"
Publora is the publish surface. Three wrapper tools in our MCP cover one-turn chains; users with the full Publora MCP plugged in (config preset shipped) get 18 tools total.
publora_list_platforms() → returns connection IDs for the user's X / LinkedIn / Instagram / Threads / TikTok / YouTube / Facebook / Bluesky / Mastodon / Telegram accounts
publora_publish_post({ content, platforms: ["linkedin-abc", "twitter-123"], media_urls: [moodboard_hero_url], scheduled_time?: "2026-06-01T09:00:00.000Z" }) — cross-post or schedule
publora_list_posts({ status: "scheduled" }) — content-calendar review
Requires PUBLORA_API_KEY on the server. Returns a friendly "not configured" error when unset; tell the user to set the key or plug mcp.publora.com directly via Settings → MCP → Add → Publora.
Recall + retention (Wave 3)
search_assets({ query: "amber", kind: "image", since: "24h" }) — find a recent asset by prompt substring. Use this when the user says "the warm-amber Aurora board from yesterday" and you need the URL.
get_recent_assets({ limit: 10 }) — full list, most recent first. Storage caps at 50/bearer.
forget_assets({ since_minutes: 60, confirm: false }) — purge the recall index. Default dry-run; pass confirm: true to actually wipe.
Cancellation (Wave 3 H4)
If the user says "stop" mid-spread: cancel_moodboard({ moodboard_id, reason: "..." }). Soft-cancels the board, in-flight slot completions discarded at persistence, future spreads refuse with a clone-the-board hint. Honest limit: in-flight fetch calls to fal continue to completion at the network layer.
The next_actions convention
Every multi-slot tool returns next_actions: [{label, tool, args, hint}] in its structuredContent. Surface them to the user inline as numbered options after rendering. Example:
Here are your 12 moodboard slots. Next:
- Animate slot-3 into a video
- Make 4 variations of slot-3
- Refine slot-3 (e.g. "warmer", "more cinematic")
- Open the live viewer
The user replies with the number; you dispatch the corresponding tool call. Users shouldn't have to remember tool names or rewrite source URLs.
Cost transparency (Wave 2 H1)
Use confirm: false before any multi-slot fan-out costing more than $0.20. Every multi-slot tool (moodboard_spread, place_subject, create_variations, generate_project) accepts confirm: false for a dry-run preview showing total estimate + per-slot cost + model pool. Echo the number to the user, then call again without confirm: false.
Approximate costs to know:
- 12-slot premium moodboard: ~$0.34
- 6-scene place_subject (nano-banana): ~$0.25
- 4 variations (mixed mode): ~$0.16
- Single flux-dev image: $0.026, gpt-image: ~$0.04, recraft-v4: $0.042
- 5s seedance-i2v-fast video: $0.21
When to use the storyboard web app vs MCP vs CLI vs Telegram
All four surfaces share the same MCP server + bearer. Pick by ergonomics:
- MCP (Claude Cowork / Desktop / Code / Cursor) — chat-driven; the agent picks tools. Best for exploration + iteration.
- Storyboard web app (
storyboard.daydream.monster) — canvas-based multi-card workflow, LoRA training studio, LV2V live streaming, fine timeline editing.
livepeer CLI — scripting + CI. Verbs: livepeer moodboard <create|spread|publish|refine|cancel>, livepeer vary, livepeer forget, livepeer run <cap>, etc.
- Telegram bot — slash commands on mobile.
/moodboard, /template, /templates, /search, /refine, /cancel, /forget, /vary route through the Hermes agent with full MCP access.
If a user asks for something the web app does better (multi-stream LV2V, LoRA training UI), point them there.
What NOT to do on first turn
- Don't enumerate all 40 tools. Ask which of the 5 intents above the user is in, then route from there.
- Don't ask the user to pick a model. The default
create_media routes intelligently; only surface model choices when explicitly requested ("use gpt-image for stylization").
- Don't write 800-character prompts. Keep
create_media prompts under 30 words. Long briefs → moodboard_spread.intent or generate_project scenes or apply_template.variables.
- Don't fire 12-slot spreads without confirming cost. Always run
confirm: false first when the estimate is > $0.20.
- Don't show raw tool JSON. Never paste MCP args,
structuredContent, or {action:"generate",…} blocks to the user. Echo human_summary in plain language instead (see cowork-ux skill).
When the user attaches an image
Cowork passes the image bytes through conversation context. Two ways to land it as a public URL:
upload_image({ data: <base64> }) — works for sub-1 MB images. Larger files often fail because the MCP transport (Cowork ↔ storyboard) has a body-size cap that truncates the base64 mid-flight. Symptom: base64 round-trip mismatch or length not multiple of 4 error.
upload_image({ source_url: <https url> }) — server fetches + re-hosts. Use this whenever (a) the image is already at a public URL (Imgur, Drive 'anyone with link', GitHub raw, fal.media, etc.) or (b) the base64 path failed. Auth-walled services (private S3, Notion) don't work.
Fall-back when both fail: tell the user to drag-drop into https://storyboard.daydream.monster (the webapp uses the same /api/upload) or livepeer upload <path> from CLI, then paste the returned URL back.
Recovery from common confusion
- "I lost the URL of an image you made earlier" →
search_assets({ query: <keyword> }) or get_recent_assets({ limit: 10 }).
- "That image was for the wrong brand" → fix the brand kit, then re-run with
context_kit_id or use set_active_brand_kit.
- "Stop, this is too expensive / wrong direction" →
cancel_moodboard({ moodboard_id, reason: "..." }).
- "Roll back this slot" → no in-place revert yet (Wave 4). For now:
refine_slot with the prior URL as the new prompt anchor, or hand the user the prior URL from slot.history[].
- "Publish this to my socials" →
publora_list_platforms then publora_publish_post. If Publora's not configured, point the user at mcp.publora.com preset.