@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 +1 -1
- package/dist/{chunk-SY7YZPSC.js → chunk-6MLZZSNM.js} +117 -71
- package/dist/{chunk-SY7YZPSC.js.map → chunk-6MLZZSNM.js.map} +1 -1
- package/dist/{chunk-KWEBCAPF.js → chunk-BYJMRIB6.js} +10 -4
- package/dist/chunk-BYJMRIB6.js.map +1 -0
- package/dist/{chunk-LSANXDSD.js → chunk-G6JFAKX3.js} +133 -108
- package/dist/{chunk-LSANXDSD.js.map → chunk-G6JFAKX3.js.map} +1 -1
- package/dist/{chunk-JID43EDM.js → chunk-TMNXECJI.js} +59 -4
- package/dist/chunk-TMNXECJI.js.map +1 -0
- package/dist/index.js +4 -4
- package/dist/prompts.js +2 -2
- package/dist/resources.js +2 -2
- package/dist/server.js +4 -4
- package/package.json +1 -1
- package/dist/chunk-JID43EDM.js.map +0 -1
- package/dist/chunk-KWEBCAPF.js.map +0 -1
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
|
|
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-
|
|
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. **
|
|
4226
|
-
- show_step_counter: true
|
|
4227
|
-
-
|
|
4228
|
-
3
|
|
4229
|
-
|
|
4230
|
-
|
|
4231
|
-
|
|
4232
|
-
|
|
4233
|
-
|
|
4234
|
-
|
|
4235
|
-
|
|
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. **
|
|
4248
|
-
- show_step_counter: true
|
|
4249
|
-
-
|
|
4250
|
-
|
|
4251
|
-
|
|
4252
|
-
|
|
4253
|
-
|
|
4254
|
-
|
|
4255
|
-
|
|
4256
|
-
|
|
4257
|
-
|
|
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. **
|
|
4276
|
-
- show_step_counter: true
|
|
4277
|
-
-
|
|
4278
|
-
3
|
|
4279
|
-
|
|
4280
|
-
|
|
4281
|
-
|
|
4282
|
-
- "
|
|
4283
|
-
|
|
4284
|
-
|
|
4285
|
-
|
|
4286
|
-
|
|
4287
|
-
|
|
4288
|
-
|
|
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
|
|
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. **
|
|
4304
|
-
- show_step_counter: true
|
|
4305
|
-
-
|
|
4306
|
-
3
|
|
4307
|
-
|
|
4308
|
-
|
|
4309
|
-
|
|
4310
|
-
|
|
4311
|
-
|
|
4312
|
-
|
|
4313
|
-
|
|
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. **
|
|
4328
|
-
- show_step_counter: false (it's so short, a counter adds unnecessary UI)
|
|
4329
|
-
-
|
|
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. **
|
|
4332
|
-
5. **
|
|
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-
|
|
4708
|
+
//# sourceMappingURL=chunk-6MLZZSNM.js.map
|