@clipform/mcp-server 1.47.1 → 2.0.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 +5 -2
- package/dist/{chunk-MV27JVSL.js → chunk-6U3CVTLZ.js} +14 -14
- package/dist/{chunk-MV27JVSL.js.map → chunk-6U3CVTLZ.js.map} +1 -1
- package/dist/{chunk-UH77CDNO.js → chunk-AP6UGWKC.js} +2 -2
- package/dist/{chunk-PJNOCHKR.js → chunk-GDUJLYR4.js} +90 -51
- package/dist/chunk-GDUJLYR4.js.map +1 -0
- package/dist/{chunk-JT7YWEQP.js → chunk-RX7V2UCM.js} +970 -133
- package/dist/chunk-RX7V2UCM.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.d.ts +10 -1
- package/dist/server.js +6 -4
- package/package.json +1 -1
- package/dist/chunk-JT7YWEQP.js.map +0 -1
- package/dist/chunk-PJNOCHKR.js.map +0 -1
- /package/dist/{chunk-UH77CDNO.js.map → chunk-AP6UGWKC.js.map} +0 -0
package/README.md
CHANGED
|
@@ -71,7 +71,8 @@ Your MCP client lists these automatically on connect (via `tools/list`). Full re
|
|
|
71
71
|
| `clipform_add_node` | Add a new node to an existing form. |
|
|
72
72
|
| `clipform_update_node` | Update one or more existing nodes' text, type, config, or options. |
|
|
73
73
|
| `clipform_delete_node` | Delete a node from a form. |
|
|
74
|
-
| `
|
|
74
|
+
| `clipform_upload_media_asset` | Put one or more media files into your workspace media library (max 10, uploaded sequentially). |
|
|
75
|
+
| `clipform_attach_node_media` | Attach an existing workspace media asset (from clipform_upload_media_asset) to one or more nodes (max 10). |
|
|
75
76
|
| `clipform_get_node_media` | Get the media attached to a node, including processing status. |
|
|
76
77
|
| `clipform_delete_node_media` | Remove media from a node. |
|
|
77
78
|
| `clipform_set_logic` | Set routing logic on one or more nodes. |
|
|
@@ -84,8 +85,10 @@ Your MCP client lists these automatically on connect (via `tools/list`). Full re
|
|
|
84
85
|
| `clipform_render_composition` | Render a specialised video composition to MP4 or PNG - custom animated visuals that clipform_generate_video can't provide, such as geography animations or designed motion graphics. |
|
|
85
86
|
| `clipform_search_music` | Search for royalty-free music tracks and ambient sounds. |
|
|
86
87
|
| `clipform_list_compositions` | Browse available video compositions and their expected props schemas. |
|
|
88
|
+
| `clipform_list_video_templates` | Browse available video templates - curated Scene arrangements (bed + overlay + sane defaults) that render through the Scene composition from a small controls object. |
|
|
89
|
+
| `clipform_render_video_template` | Render a curated video template (a pre-arranged Scene: bed + overlay + sane defaults) to MP4 or PNG from a small controls object, instead of hand-assembling Scene layers. |
|
|
87
90
|
| `clipform_list_assets` | List available creative assets (sound effects, animations, fonts) for video compositions. |
|
|
88
|
-
| `clipform_check_render` | Check the status of render jobs started by clipform_generate_video or clipform_render_composition. |
|
|
91
|
+
| `clipform_check_render` | Check the status of render jobs started by clipform_generate_video, clipform_render_video_template, or clipform_render_composition. |
|
|
89
92
|
| `clipform_fetch_boundary` | Fetch a GeoJSON boundary polygon for a country, city, or region. |
|
|
90
93
|
| `clipform_get_guide` | Retrieve craft knowledge for building a specific form type. |
|
|
91
94
|
| `clipform_get_workflow` | Retrieve a step-by-step build workflow for creating a specific form type. |
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
WORKFLOW_TYPES,
|
|
3
3
|
getDiscoveryParams,
|
|
4
4
|
getSessionContextWithAuth
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-GDUJLYR4.js";
|
|
6
6
|
import {
|
|
7
7
|
__export
|
|
8
8
|
} from "./chunk-HCZI2UJ5.js";
|
|
@@ -4099,7 +4099,7 @@ function resourceLink(name, uri, title) {
|
|
|
4099
4099
|
}
|
|
4100
4100
|
var BUILD_ONCE_STEP = "**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:";
|
|
4101
4101
|
var TAGS_LINE = "- tags: one format (quiz/survey/interview/feedback/lead-gen), one genre (trivia/personality/nps/poll/testimonial), and 2-3 topic words";
|
|
4102
|
-
var ATTACH_MEDIA_STEP = "**Attach media
|
|
4102
|
+
var ATTACH_MEDIA_STEP = "**Attach media**: pass node_id (and form_id) on each render call (clipform_generate_video / clipform_render_video_template / clipform_render_composition) so it attaches to the node automatically once the render finishes - do not poll clipform_check_render to completion, just fire the renders and move on. Fall back to the manual two-step only for a render that didn't take a node_id: first clipform_upload_media_asset (batch all uploads in one call, include captions), then clipform_attach_node_media (batch all attachments in one call), setting show_captions: true and fit_media: true (generated renders must not be cropped).";
|
|
4103
4103
|
var REPUBLISH_STEP = "**Republish** with clipform_update_form (is_live: true) - forms are live from creation, but media and edits added since are only visible in the live form after republishing. Never skip this when you attached anything.";
|
|
4104
4104
|
function quizWorkflow(args, sessionContext, authMode = "authenticated") {
|
|
4105
4105
|
const topic = args.topic ? ` about "${args.topic}"` : "";
|
|
@@ -4122,9 +4122,9 @@ function quizWorkflow(args, sessionContext, authMode = "authenticated") {
|
|
|
4122
4122
|
- NOTE: Personalised messages per score tier (score_ranges) are coming soon. For now, write one great end screen message that works for all scores.
|
|
4123
4123
|
${TAGS_LINE}
|
|
4124
4124
|
4. **Generate narration** with clipform_generate_tts - batch ALL questions in a single call (pass an array of items). Tease the question - do NOT reveal the answer or read options aloud. Keep each narration 5-15 seconds.
|
|
4125
|
-
5. **Build video** for each question -
|
|
4125
|
+
5. **Build video** for each question - pass each question's node_id (and form_id) on the render call so it attaches automatically once done. Pick per question; mixing treatments across one quiz is fine:
|
|
4126
4126
|
- Default - narrated slideshow: clipform_search_media (kind: "image", 3 images per question, batch all queries in one call), then clipform_generate_video with wait: false per question - fires all renders in parallel - then collect URLs with clipform_check_render.
|
|
4127
|
-
- Designed visual - when a composition fits the question or the user asks for one (e.g. a grid reveal):
|
|
4127
|
+
- Designed visual - when a recipe or composition fits the question or the user asks for one (e.g. a versus, a grid reveal, guess-the-city): recipe book first - clipform_list_video_templates and match the mechanic to a recipe, then clipform_render_video_template with its curated controls (wait: false, one call per question). Only if no recipe fits, drop to the raw primitives - clipform_list_compositions, then ONE clipform_render_composition call with items (all clips render in parallel). Collect job_ids with clipform_check_render. Both take narration via sound.narration.
|
|
4128
4128
|
6. ${ATTACH_MEDIA_STEP}
|
|
4129
4129
|
7. ${REPUBLISH_STEP}
|
|
4130
4130
|
8. **Log** with clipform_log_generation (sources, images, attributions)
|
|
@@ -4220,13 +4220,13 @@ function compositionQuizWorkflow(args, sessionContext, authMode = "authenticated
|
|
|
4220
4220
|
const topic = args.topic ? ` about "${args.topic}"` : "";
|
|
4221
4221
|
const count = args.question_count ?? 5;
|
|
4222
4222
|
const discovery = buildDiscovery(getDiscoveryParams("quiz", "composition", authMode === "anonymous" ? "demo" : "full"), args, authMode);
|
|
4223
|
-
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,
|
|
4223
|
+
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, 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.
|
|
4224
4224
|
|
|
4225
4225
|
## Composition Quiz Workflow
|
|
4226
4226
|
|
|
4227
|
-
1. **Discover what's renderable
|
|
4227
|
+
1. **Discover what's renderable - recipe book first.** Call clipform_list_video_templates and match each question's mechanic against a recipe's description/keywords (e.g. guess-the-city for a where-in-the-world/geography mechanic, mystery-reveal for guess-the-image/flag, colour-grid for palette-matching). Render a matched recipe with clipform_render_video_template and its curated controls. Only when no recipe fits a question, drop to the raw primitives - clipform_list_compositions, matched via the composition guide's matrix - and render with clipform_render_composition. Availability varies by session; choose ONLY from what these tools return. Mix 2-3 mechanics across the quiz; for questions with no fitting recipe or composition, use the base quiz's Ken Burns pipeline instead.
|
|
4228
4228
|
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.
|
|
4229
|
-
3. **Render all clips** in ONE clipform_render_composition call with items
|
|
4229
|
+
3. **Render all clips** - raw-composition clips batch in ONE clipform_render_composition call with items (parallel); recipe clips render one clipform_render_video_template call each (wait: false). Collect all job_ids with clipform_check_render. Chain-state compositions: clue clip animate: true, reveal clip animate: false + answer props.
|
|
4230
4230
|
4. ${BUILD_ONCE_STEP}
|
|
4231
4231
|
- Settings: show_step_counter: true, disable_back_navigation: true
|
|
4232
4232
|
- Per question, a PAIR of nodes:
|
|
@@ -4235,7 +4235,7 @@ function compositionQuizWorkflow(args, sessionContext, authMode = "authenticated
|
|
|
4235
4235
|
- 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.
|
|
4236
4236
|
- tags: format "quiz", genre "trivia", and 2-3 topic words
|
|
4237
4237
|
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.
|
|
4238
|
-
6.
|
|
4238
|
+
6. ${ATTACH_MEDIA_STEP} Attach the clue clip to each choice node and the reveal clip to each button node.
|
|
4239
4239
|
7. ${REPUBLISH_STEP}
|
|
4240
4240
|
8. **Log** with clipform_log_generation - record the composition IDs used per question alongside sources and attributions`;
|
|
4241
4241
|
}
|
|
@@ -4253,7 +4253,7 @@ function interviewWorkflow(args, sessionContext, authMode = "authenticated") {
|
|
|
4253
4253
|
- Settings: show_step_counter: true, disable_back_navigation: false
|
|
4254
4254
|
- Warm-up question first (type: "open") - something easy: "Tell us your name and role"
|
|
4255
4255
|
- 2-3 core questions (type: "open") - one topic per question.${format === "all" ? " Enable text + audio + video responses." : ` Enable ${format} responses.`}
|
|
4256
|
-
- Contact collection (type: "
|
|
4256
|
+
- Contact collection (type: "details") - first name + email minimum${consent ? `
|
|
4257
4257
|
- Consent node - "I agree that my response may be used in [context]"` : ""}
|
|
4258
4258
|
- End screen that sets expectations: "Thanks! We'll be in touch."
|
|
4259
4259
|
${TAGS_LINE}
|
|
@@ -4275,7 +4275,7 @@ function surveyWorkflow(args, sessionContext, authMode = "authenticated") {
|
|
|
4275
4275
|
- Key metric question FIRST (type: "choice" or "rating") - while attention is highest
|
|
4276
4276
|
- One "why?" follow-up (type: "open") - "What's the main reason for your score?"
|
|
4277
4277
|
- 2-3 specific questions (type: "choice") - only ask what you'll act on${!anonymous ? `
|
|
4278
|
-
- Contact collection (type: "
|
|
4278
|
+
- Contact collection (type: "details") - name + email for follow-up` : ""}
|
|
4279
4279
|
- End screen: "Thanks for your feedback!"
|
|
4280
4280
|
${TAGS_LINE}
|
|
4281
4281
|
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).
|
|
@@ -4324,7 +4324,7 @@ function applicationWorkflow(args, sessionContext, authMode = "authenticated") {
|
|
|
4324
4324
|
1. **Define what you're screening for** - what qualifications matter, and what questions reveal fit?
|
|
4325
4325
|
2. ${BUILD_ONCE_STEP}
|
|
4326
4326
|
- Settings: show_step_counter: true, disable_back_navigation: false
|
|
4327
|
-
- Contact collection first (type: "
|
|
4327
|
+
- Contact collection first (type: "details") - name, email, phone - while motivation is high
|
|
4328
4328
|
- 2-3 structured screening questions (type: "choice") - experience level, availability, relevant qualifications. These help you filter quickly.
|
|
4329
4329
|
- 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.
|
|
4330
4330
|
- Optional "Anything else?" (type: "open") - catches things you didn't think to ask.
|
|
@@ -4345,7 +4345,7 @@ function bookingWorkflow(args, sessionContext, authMode = "authenticated") {
|
|
|
4345
4345
|
1. **Define the essentials** - what info do you actually need from attendees? Keep the list short.
|
|
4346
4346
|
2. ${BUILD_ONCE_STEP}
|
|
4347
4347
|
- Settings: show_step_counter: false (it's so short, a counter adds unnecessary UI), disable_back_navigation: false
|
|
4348
|
-
- Contact collection (type: "
|
|
4348
|
+
- Contact collection (type: "details") - name + email minimum. Add phone only if needed.
|
|
4349
4349
|
- 1-3 event-specific questions (type: "choice") - session preferences, dietary requirements, experience level. Only ask what you'll use.
|
|
4350
4350
|
- 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)
|
|
4351
4351
|
- tags: format "registration", genre "${eventType}", and 2-3 topic words
|
|
@@ -4559,7 +4559,7 @@ Outcome categories: ${args.categories}` : "";
|
|
|
4559
4559
|
"create-composition-quiz",
|
|
4560
4560
|
{
|
|
4561
4561
|
title: "Create a Composition Quiz",
|
|
4562
|
-
description: "Build a guess-and-reveal quiz from rendered compositions - flag sweeps,
|
|
4562
|
+
description: "Build a guess-and-reveal quiz from rendered compositions - flag sweeps, Rebus puzzles, blur reveals, odd-one-out grids - instead of stock-image slideshows",
|
|
4563
4563
|
argsSchema: {
|
|
4564
4564
|
topic: external_exports.string().optional().describe("Quiz topic (e.g. 'world flags', 'movie emoji', '90s music')"),
|
|
4565
4565
|
question_count: external_exports.string().optional().default("5").describe("Number of questions (default: 5 - each question is a clue + reveal node pair)")
|
|
@@ -4709,4 +4709,4 @@ export {
|
|
|
4709
4709
|
getWorkflowText,
|
|
4710
4710
|
registerPrompts
|
|
4711
4711
|
};
|
|
4712
|
-
//# sourceMappingURL=chunk-
|
|
4712
|
+
//# sourceMappingURL=chunk-6U3CVTLZ.js.map
|