@clipform/mcp-server 1.33.0 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -84,7 +84,7 @@ You can also pass the key as a CLI flag: `npx -y @clipform/mcp-server --api-key=
84
84
 
85
85
  | Tool | Description |
86
86
  |------|-------------|
87
- | `clipform_render_composition` | Render a video composition to MP4 or PNG (waits, returns URL) |
87
+ | `clipform_render_composition` | Render a video composition to MP4 or PNG - flag reveals, emoji puzzles, grids, timelines, map motion and more. Pass `wait: false` to fire renders in parallel and poll for results |
88
88
  | `clipform_generate_tts` | Generate narration audio with word-level captions |
89
89
  | `clipform_generate_slideshow` | Create slideshow videos from images + audio (waits, returns URL) |
90
90
  | `clipform_generate_video` | Generate video from images, clips, or both synced to audio. Pass `wait: false` to fire renders in parallel and poll for results |
@@ -2,7 +2,7 @@ import {
2
2
  WORKFLOW_TYPES,
3
3
  getDiscoveryParams,
4
4
  getSessionContextWithAuth
5
- } from "./chunk-KWEBCAPF.js";
5
+ } from "./chunk-BYJMRIB6.js";
6
6
  import {
7
7
  __export
8
8
  } from "./chunk-HCZI2UJ5.js";
@@ -4212,6 +4212,29 @@ Wrong answers should sound right to someone who didn't watch but googled the top
4212
4212
 
4213
4213
  > **Text-only override:** If the user explicitly asked for text-only (no video), skip steps 7-8 (video production and media attachment). Still generate narration in step 6.`;
4214
4214
  }
4215
+ function compositionQuizWorkflow(args, sessionContext, authMode = "authenticated") {
4216
+ const topic = args.topic ? ` about "${args.topic}"` : "";
4217
+ const count = args.question_count ?? 5;
4218
+ const discovery = buildDiscovery(getDiscoveryParams("quiz", "composition", authMode === "anonymous" ? "demo" : "full"), args, authMode);
4219
+ return `${sessionContext ? sessionContext + "\n\n" : ""}${discovery}Here's how to build a ${count}-question composition quiz${topic} with Clipform - a guess-and-reveal quiz where each question is a rendered composition (flag sweep, emoji rebus, blurred photo resolving) instead of a stock-image slideshow. Read the attached quiz and composition guides for the mechanic matrix, the clue \u2192 reveal node pattern, and difficulty design.
4220
+
4221
+ ## Composition Quiz Workflow
4222
+
4223
+ 1. **Discover what's renderable** - call clipform_list_compositions. Availability varies by session; choose mechanics ONLY from what it returns. Match each question to a mechanic via the composition guide's matrix. Mix 2-3 mechanics across the quiz; for questions with no fitting composition, use the base quiz's Ken Burns pipeline instead.
4224
+ 2. **Write questions** - difficulty curve as in the base guide. Difficulty = subject obscurity (Japan's flag vs Kiribati's), never clue degradation. ${count} questions \u2248 ${count * 2 + 1} nodes (each question is a clue + reveal pair) - check the plan's node limit.
4225
+ 3. **Render all clips** with clipform_render_composition, wait: false on EVERY call - fire the full batch (clue clip + reveal clip per question), then collect URLs with clipform_check_render. Chain-state compositions: clue clip animate: true, reveal clip animate: false + answer props.
4226
+ 4. **Build the whole form in ONE clipform_create_form call** - pass nodes, settings, and tags together; do NOT create an empty form and add nodes one by one:
4227
+ - Settings: show_step_counter: true, disable_back_navigation: true
4228
+ - Per question, a PAIR of nodes:
4229
+ - Clue node (type: "choice"): question as prompt, config { choice: { show_answer_feedback: true }, randomise_options: true }, options with score: 1 on the correct answer and score: 0 on 2-3 wrong ones. Scored options enable correct-answer marking automatically.
4230
+ - Reveal node (type: "button"): the answer in the prompt ("It was Japan!"), config { button_text: "Next one" }
4231
+ - Final end_screen node: show_score: true, icon: "trophy", show_share_button: true, cta_type: "restart", cta_text: a short challenge. NOTE: per-tier messages (score_ranges) are coming soon - write one great message.
4232
+ - tags: format "quiz", genre "trivia", and 2-3 topic words
4233
+ 5. **Generate narration** with clipform_generate_tts - batch ALL items in one call. The visual does the teasing: set stakes, never describe what's on screen or read the clue aloud. Reveal narration can celebrate.
4234
+ 6. **Attach media** with clipform_upload_node_media (batch all uploads in one call) - clue clip on each choice node, reveal clip on each button node. Include captions, set show_captions: true.
4235
+ 7. **Publish** with clipform_update_form
4236
+ 8. **Log** with clipform_log_generation - record the composition IDs used per question alongside sources and attributions`;
4237
+ }
4215
4238
  function interviewWorkflow(args, sessionContext, authMode = "authenticated") {
4216
4239
  const purpose = args.purpose ?? "responses";
4217
4240
  const format = args.response_format ?? "all";
@@ -4222,18 +4245,17 @@ function interviewWorkflow(args, sessionContext, authMode = "authenticated") {
4222
4245
  ## Workflow
4223
4246
 
4224
4247
  1. **Identify the ask** - what do you need from respondents? ${purpose}.
4225
- 2. **Create the form** with clipform_create_form:
4226
- - show_step_counter: true
4227
- - disable_back_navigation: false
4228
- 3. **Add a warm-up question** - something easy: "Tell us your name and role" (type: "open")
4229
- 4. **Add core questions** (type: "open") - 2-3 max, one topic per question.${format === "all" ? " Enable text + audio + video responses." : ` Enable ${format} responses.`}
4230
- 5. **Add contact collection** (type: "contact") - first name + email minimum${consent ? `
4231
- 6. **Add consent** - "I agree that my response may be used in [context]"` : ""}
4232
- 7. **Update end screen** - set expectations: "Thanks! We'll be in touch."
4233
- 8. **Optional - Rich Media:** Add TTS narration (clipform_generate_tts) with a warm, inviting tone - "We'd love to hear your story..." Video backgrounds (clipform_search_media \u2192 clipform_generate_video) on the intro question can set a professional tone.
4234
- 9. **Publish** with clipform_update_form
4235
- 10. **Tag the form** - pass tags: one format (quiz/survey/interview/feedback/lead-gen), one genre (trivia/personality/nps/poll/testimonial), and 2-3 topic words
4236
- 11. **Log** with clipform_log_generation`;
4248
+ 2. **Build the whole form in ONE clipform_create_form call** - pass nodes, settings, and tags together; do NOT create an empty form and add nodes one by one:
4249
+ - Settings: show_step_counter: true, disable_back_navigation: false
4250
+ - Warm-up question first (type: "open") - something easy: "Tell us your name and role"
4251
+ - 2-3 core questions (type: "open") - one topic per question.${format === "all" ? " Enable text + audio + video responses." : ` Enable ${format} responses.`}
4252
+ - Contact collection (type: "contact") - first name + email minimum${consent ? `
4253
+ - Consent node - "I agree that my response may be used in [context]"` : ""}
4254
+ - End screen that sets expectations: "Thanks! We'll be in touch."
4255
+ - tags: one format (quiz/survey/interview/feedback/lead-gen), one genre (trivia/personality/nps/poll/testimonial), and 2-3 topic words
4256
+ 3. **Optional - Rich Media:** Add TTS narration (clipform_generate_tts, batch all questions in one call) with a warm, inviting tone - "We'd love to hear your story..." Video backgrounds (clipform_search_media \u2192 clipform_generate_video) on the intro question can set a professional tone.
4257
+ 4. **Publish** with clipform_update_form
4258
+ 5. **Log** with clipform_log_generation`;
4237
4259
  }
4238
4260
  function surveyWorkflow(args, sessionContext, authMode = "authenticated") {
4239
4261
  const topic = args.topic ? ` for ${args.topic}` : "";
@@ -4244,18 +4266,17 @@ function surveyWorkflow(args, sessionContext, authMode = "authenticated") {
4244
4266
  ## Workflow
4245
4267
 
4246
4268
  1. **Define the key metric** - what's the one number you care about? (NPS, satisfaction, likelihood to recommend)
4247
- 2. **Create the form** with clipform_create_form:
4248
- - show_step_counter: true
4249
- - disable_back_navigation: false
4250
- 3. **Add key metric question first** (type: "choice" or "rating") - put it first while attention is highest
4251
- 4. **Add one "why?" follow-up** (type: "open") - "What's the main reason for your score?"
4252
- 5. **Add 2-3 specific questions** (type: "choice") - only ask what you'll act on${!anonymous ? `
4253
- 6. **Contact** - collect name + email for follow-up` : ""}
4254
- 7. **Optional - Rich Media:** For a more engaging experience, add TTS narration (clipform_generate_tts) for the intro or key questions, video backgrounds (clipform_search_media \u2192 clipform_generate_video), or background music (clipform_search_music).
4255
- 8. **Update end screen** - "Thanks for your feedback!"
4256
- 9. **Publish** with clipform_update_form
4257
- 10. **Tag the form** - pass tags: one format (quiz/survey/interview/feedback/lead-gen), one genre (trivia/personality/nps/poll/testimonial), and 2-3 topic words
4258
- 11. **Log** with clipform_log_generation
4269
+ 2. **Build the whole form in ONE clipform_create_form call** - pass nodes, settings, and tags together; do NOT create an empty form and add nodes one by one:
4270
+ - Settings: show_step_counter: true, disable_back_navigation: false
4271
+ - Key metric question FIRST (type: "choice" or "rating") - while attention is highest
4272
+ - One "why?" follow-up (type: "open") - "What's the main reason for your score?"
4273
+ - 2-3 specific questions (type: "choice") - only ask what you'll act on${!anonymous ? `
4274
+ - Contact collection (type: "contact") - name + email for follow-up` : ""}
4275
+ - End screen: "Thanks for your feedback!"
4276
+ - tags: one format (quiz/survey/interview/feedback/lead-gen), one genre (trivia/personality/nps/poll/testimonial), and 2-3 topic words
4277
+ 3. **Optional - Rich Media:** For a more engaging experience, add TTS narration (clipform_generate_tts) for the intro or key questions, video backgrounds (clipform_search_media \u2192 clipform_generate_video), or background music (clipform_search_music).
4278
+ 4. **Publish** with clipform_update_form
4279
+ 5. **Log** with clipform_log_generation
4259
4280
 
4260
4281
  ## Key rule: 5 questions max. Every extra question costs completions.`;
4261
4282
  }
@@ -4272,25 +4293,22 @@ function testimonialWorkflow(args, sessionContext, authMode = "authenticated") {
4272
4293
  ## Workflow
4273
4294
 
4274
4295
  1. **Define the story arc** - what transformation or experience do you want to capture?
4275
- 2. **Create the form** with clipform_create_form:
4276
- - show_step_counter: true
4277
- - disable_back_navigation: false
4278
- 3. **Add warm-up question** (type: "open") - "Tell us your name and [role/relationship/context]". Enable video + audio + text responses.
4279
- 4. **Add 2-3 storytelling prompts** (type: "open") - follow the before \u2192 during \u2192 after arc. Enable video responses. Example prompts:
4280
- - "What was your biggest challenge before?"
4281
- - "What was the experience like working with us?"
4282
- - "What's different now? What would you tell someone considering it?"
4283
- 5. **Add consent node** - "I agree that my response may be used in marketing materials, on the website, and in sales presentations."
4284
- 6. **Generate narration** with clipform_generate_tts - batch all prompts in a single call. Warm, appreciative tone - "We'd love to hear your story..." Keep each narration 5-8 seconds.
4285
- 7. **Optional: build video** for the intro/warm-up question to set the tone.
4286
- 8. **Update end screen** - "Thank you for sharing your story! Your experience will help others."
4287
- - icon: "party"
4288
- - No score, no restart CTA
4289
- 9. **Publish** with clipform_update_form
4290
- 10. **Tag the form** - pass tags: format "testimonial", genre "story", and 2-3 topic words
4291
- 11. **Log** with clipform_log_generation
4296
+ 2. **Build the whole form in ONE clipform_create_form call** - pass nodes, settings, and tags together; do NOT create an empty form and add nodes one by one:
4297
+ - Settings: show_step_counter: true, disable_back_navigation: false
4298
+ - Warm-up question (type: "open") - "Tell us your name and [role/relationship/context]". Enable video + audio + text responses.
4299
+ - 2-3 storytelling prompts (type: "open") - follow the before \u2192 during \u2192 after arc. Enable video responses. Example prompts:
4300
+ - "What was your biggest challenge before?"
4301
+ - "What was the experience like working with us?"
4302
+ - "What's different now? What would you tell someone considering it?"
4303
+ - Consent node - "I agree that my response may be used in marketing materials, on the website, and in sales presentations."
4304
+ - End screen: "Thank you for sharing your story! Your experience will help others." icon: "party", no score, no restart CTA
4305
+ - tags: format "testimonial", genre "story", and 2-3 topic words
4306
+ 3. **Generate narration** with clipform_generate_tts - batch all prompts in a single call. Warm, appreciative tone - "We'd love to hear your story..." Keep each narration 5-8 seconds.
4307
+ 4. **Optional: build video** for the intro/warm-up question to set the tone.
4308
+ 5. **Publish** with clipform_update_form
4309
+ 6. **Log** with clipform_log_generation
4292
4310
 
4293
- > **Text-only override:** If the user explicitly asked for text-only (no video), skip steps 6-7 (narration and video production).`;
4311
+ > **Text-only override:** If the user explicitly asked for text-only (no video), skip steps 3-4 (narration and video production).`;
4294
4312
  }
4295
4313
  function applicationWorkflow(args, sessionContext, authMode = "authenticated") {
4296
4314
  const role = args.role ?? "an application";
@@ -4300,20 +4318,17 @@ function applicationWorkflow(args, sessionContext, authMode = "authenticated") {
4300
4318
  ## Workflow
4301
4319
 
4302
4320
  1. **Define what you're screening for** - what qualifications matter, and what questions reveal fit?
4303
- 2. **Create the form** with clipform_create_form:
4304
- - show_step_counter: true
4305
- - disable_back_navigation: false
4306
- 3. **Add contact collection** (type: "contact") - name, email, phone. Place it first while motivation is high.
4307
- 4. **Add 2-3 structured screening questions** (type: "choice") - experience level, availability, relevant qualifications. These help you filter quickly.
4308
- 5. **Add 1-2 open response questions** (type: "open") - "Tell us why you're interested" or "Walk us through a relevant experience." Enable video + audio + text responses.
4309
- 6. **Optional: add "Anything else?"** (type: "open") - catches things you didn't think to ask.
4310
- 7. **Optional - Rich Media:** Add TTS narration (clipform_generate_tts) - professional and welcoming: "Thanks for your interest - let's get to know you." Video backgrounds (clipform_search_media \u2192 clipform_generate_video) on the intro can make the application feel more personal.
4311
- 8. **Update end screen** - "Your application has been submitted. We'll review it and get back to you."
4312
- - icon: "tick"
4313
- - No score, no restart
4314
- 9. **Publish** with clipform_update_form
4315
- 10. **Tag the form** - pass tags: format "application", genre "screening", and 2-3 topic words
4316
- 11. **Log** with clipform_log_generation`;
4321
+ 2. **Build the whole form in ONE clipform_create_form call** - pass nodes, settings, and tags together; do NOT create an empty form and add nodes one by one:
4322
+ - Settings: show_step_counter: true, disable_back_navigation: false
4323
+ - Contact collection first (type: "contact") - name, email, phone - while motivation is high
4324
+ - 2-3 structured screening questions (type: "choice") - experience level, availability, relevant qualifications. These help you filter quickly.
4325
+ - 1-2 open response questions (type: "open") - "Tell us why you're interested" or "Walk us through a relevant experience." Enable video + audio + text responses.
4326
+ - Optional "Anything else?" (type: "open") - catches things you didn't think to ask.
4327
+ - End screen: "Your application has been submitted. We'll review it and get back to you." icon: "tick", no score, no restart
4328
+ - tags: format "application", genre "screening", and 2-3 topic words
4329
+ 3. **Optional - Rich Media:** Add TTS narration (clipform_generate_tts) - professional and welcoming: "Thanks for your interest - let's get to know you." Video backgrounds (clipform_search_media \u2192 clipform_generate_video) on the intro can make the application feel more personal.
4330
+ 4. **Publish** with clipform_update_form
4331
+ 5. **Log** with clipform_log_generation`;
4317
4332
  }
4318
4333
  function bookingWorkflow(args, sessionContext, authMode = "authenticated") {
4319
4334
  const eventName = args.event_name ?? "an event";
@@ -4324,19 +4339,15 @@ function bookingWorkflow(args, sessionContext, authMode = "authenticated") {
4324
4339
  ## Workflow
4325
4340
 
4326
4341
  1. **Define the essentials** - what info do you actually need from attendees? Keep the list short.
4327
- 2. **Create the form** with clipform_create_form:
4328
- - show_step_counter: false (it's so short, a counter adds unnecessary UI)
4329
- - disable_back_navigation: false
4342
+ 2. **Build the whole form in ONE clipform_create_form call** - pass nodes, settings, and tags together; do NOT create an empty form and add nodes one by one:
4343
+ - Settings: show_step_counter: false (it's so short, a counter adds unnecessary UI), disable_back_navigation: false
4344
+ - Contact collection (type: "contact") - name + email minimum. Add phone only if needed.
4345
+ - 1-3 event-specific questions (type: "choice") - session preferences, dietary requirements, experience level. Only ask what you'll use.
4346
+ - End screen: "You're registered! Here's what to expect." Include event details (date, time, location/link) in the message. icon: "tick", no score, no restart, cta_type: "external_link" with a URL to calendar invite or event page (if available)
4347
+ - tags: format "registration", genre "${eventType}", and 2-3 topic words
4330
4348
  3. **Optional: add welcome video** - a short intro from the host. Generate narration with clipform_generate_tts, then build a video with clipform_search_media + clipform_generate_video.
4331
- 4. **Add contact collection** (type: "contact") - name + email minimum. Add phone only if needed.
4332
- 5. **Add 1-3 event-specific questions** (type: "choice") - session preferences, dietary requirements, experience level. Only ask what you'll use.
4333
- 6. **Update end screen** - "You're registered! Here's what to expect." Include event details (date, time, location/link) in the message.
4334
- - icon: "tick"
4335
- - No score, no restart
4336
- - cta_type: "external_link" with a URL to calendar invite or event page (if available)
4337
- 7. **Publish** with clipform_update_form
4338
- 8. **Tag the form** - pass tags: format "registration", genre "${eventType}", and 2-3 topic words
4339
- 9. **Log** with clipform_log_generation
4349
+ 4. **Publish** with clipform_update_form
4350
+ 5. **Log** with clipform_log_generation
4340
4351
 
4341
4352
  ## Key rule: 3-5 fields max. Every extra field costs registrations.`;
4342
4353
  }
@@ -4351,7 +4362,8 @@ var WORKFLOW_BUILDERS = {
4351
4362
  };
4352
4363
  var QUIZ_VARIANT_BUILDERS = {
4353
4364
  "personality": personalityQuizWorkflow,
4354
- "comprehension": comprehensionQuizWorkflow
4365
+ "comprehension": comprehensionQuizWorkflow,
4366
+ "composition": compositionQuizWorkflow
4355
4367
  };
4356
4368
  async function getWorkflowText(type, args = {}, variant) {
4357
4369
  const { text: sessionContext, authMode } = await getSessionContextWithAuth();
@@ -4539,6 +4551,40 @@ Outcome categories: ${args.categories}` : "";
4539
4551
  };
4540
4552
  }
4541
4553
  );
4554
+ server.registerPrompt(
4555
+ "create-composition-quiz",
4556
+ {
4557
+ title: "Create a Composition Quiz",
4558
+ description: "Build a guess-and-reveal quiz from rendered compositions - flag sweeps, emoji puzzles, blur reveals, odd-one-out grids - instead of stock-image slideshows",
4559
+ argsSchema: {
4560
+ topic: external_exports.string().optional().describe("Quiz topic (e.g. 'world flags', 'movie emoji', '90s music')"),
4561
+ question_count: external_exports.string().optional().default("5").describe("Number of questions (default: 5 - each question is a clue + reveal node pair)")
4562
+ }
4563
+ },
4564
+ async (rawArgs) => {
4565
+ const args = coercePromptArgs(rawArgs);
4566
+ return {
4567
+ messages: [
4568
+ {
4569
+ role: "user",
4570
+ content: {
4571
+ type: "text",
4572
+ text: `I want to create a composition quiz${args.topic ? ` about "${args.topic}"` : ""}. ${args.question_count ?? 5} questions, guess-and-reveal style.`
4573
+ }
4574
+ },
4575
+ resourceLink("guide-quiz", "clipform://guides/quiz", "Quiz Writing Guide"),
4576
+ resourceLink("guide-quiz-composition", "clipform://guides/quiz/composition", "Composition Quiz Addendum"),
4577
+ {
4578
+ role: "assistant",
4579
+ content: {
4580
+ type: "text",
4581
+ text: await getWorkflowText("quiz", args, "composition")
4582
+ }
4583
+ }
4584
+ ]
4585
+ };
4586
+ }
4587
+ );
4542
4588
  server.registerPrompt(
4543
4589
  "create-funnel",
4544
4590
  {
@@ -4659,4 +4705,4 @@ export {
4659
4705
  getWorkflowText,
4660
4706
  registerPrompts
4661
4707
  };
4662
- //# sourceMappingURL=chunk-SY7YZPSC.js.map
4708
+ //# sourceMappingURL=chunk-6MLZZSNM.js.map