@clipform/mcp-server 1.5.0 → 1.7.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.
Files changed (71) hide show
  1. package/README.md +21 -9
  2. package/dist/__tests__/config-sync.test.js +8 -27
  3. package/dist/__tests__/config-sync.test.js.map +1 -1
  4. package/dist/lib/api-client.d.ts +1 -1
  5. package/dist/lib/api-client.js +21 -5
  6. package/dist/lib/api-client.js.map +1 -1
  7. package/dist/lib/auth-context.d.ts +17 -0
  8. package/dist/lib/auth-context.js +9 -0
  9. package/dist/lib/auth-context.js.map +1 -0
  10. package/dist/lib/config.d.ts +9 -11
  11. package/dist/lib/config.js +3 -336
  12. package/dist/lib/config.js.map +1 -1
  13. package/dist/lib/schemas.d.ts +3 -3
  14. package/dist/lib/schemas.js +24 -6
  15. package/dist/lib/schemas.js.map +1 -1
  16. package/dist/lib/session-context.d.ts +1 -0
  17. package/dist/lib/session-context.js +32 -0
  18. package/dist/lib/session-context.js.map +1 -0
  19. package/dist/prompts.js +241 -125
  20. package/dist/prompts.js.map +1 -1
  21. package/dist/resources.d.ts +2 -0
  22. package/dist/resources.js +336 -0
  23. package/dist/resources.js.map +1 -0
  24. package/dist/server.js +7 -3
  25. package/dist/server.js.map +1 -1
  26. package/dist/tools/add-question.js +2 -2
  27. package/dist/tools/add-question.js.map +1 -1
  28. package/dist/tools/attach-question-audio.js +2 -2
  29. package/dist/tools/attach-question-audio.js.map +1 -1
  30. package/dist/tools/create-form.js +65 -12
  31. package/dist/tools/create-form.js.map +1 -1
  32. package/dist/tools/delete-form.js +2 -2
  33. package/dist/tools/delete-form.js.map +1 -1
  34. package/dist/tools/delete-question-media.js +2 -2
  35. package/dist/tools/delete-question-media.js.map +1 -1
  36. package/dist/tools/delete-question.js +2 -2
  37. package/dist/tools/delete-question.js.map +1 -1
  38. package/dist/tools/generate-slideshow.js +114 -17
  39. package/dist/tools/generate-slideshow.js.map +1 -1
  40. package/dist/tools/generate-tts.js +3 -2
  41. package/dist/tools/generate-tts.js.map +1 -1
  42. package/dist/tools/generate-video.d.ts +2 -0
  43. package/dist/tools/generate-video.js +113 -0
  44. package/dist/tools/generate-video.js.map +1 -0
  45. package/dist/tools/get-form.js +1 -1
  46. package/dist/tools/get-form.js.map +1 -1
  47. package/dist/tools/get-question-media.js +2 -2
  48. package/dist/tools/get-question-media.js.map +1 -1
  49. package/dist/tools/list-assets.js +1 -1
  50. package/dist/tools/list-assets.js.map +1 -1
  51. package/dist/tools/list-compositions.js +3 -3
  52. package/dist/tools/list-compositions.js.map +1 -1
  53. package/dist/tools/log-generation.js +3 -3
  54. package/dist/tools/log-generation.js.map +1 -1
  55. package/dist/tools/render-composition.js +6 -4
  56. package/dist/tools/render-composition.js.map +1 -1
  57. package/dist/tools/search-media.js +1 -1
  58. package/dist/tools/search-media.js.map +1 -1
  59. package/dist/tools/search-music.js +1 -1
  60. package/dist/tools/search-music.js.map +1 -1
  61. package/dist/tools/search-news.js +1 -1
  62. package/dist/tools/search-news.js.map +1 -1
  63. package/dist/tools/set-question-logic.js +2 -2
  64. package/dist/tools/set-question-logic.js.map +1 -1
  65. package/dist/tools/update-form.js +39 -3
  66. package/dist/tools/update-form.js.map +1 -1
  67. package/dist/tools/update-question.js +2 -2
  68. package/dist/tools/update-question.js.map +1 -1
  69. package/dist/tools/upload-question-media.js +14 -6
  70. package/dist/tools/upload-question-media.js.map +1 -1
  71. package/package.json +3 -2
@@ -0,0 +1,336 @@
1
+ import { getSessionContext } from "./lib/session-context.js";
2
+ const WRITING_PRINCIPLES = `## Writing Principles
3
+
4
+ - **Write for the ear.** Narration is spoken aloud. Short sentences. Natural rhythm.
5
+ - **Research before writing.** Find 2-3 genuinely interesting facts per topic. Generic content doesn't hold attention.
6
+ - **Conversational, not encyclopaedic.** "Here's what's wild about this..." not "The subject is characterized by..."
7
+ - **Cut ruthlessly.** Every word must earn its place.
8
+ - **Never reveal answers in narration.** The user picks from options - narration teases and builds intrigue.
9
+ - **Don't read answer options aloud.** The viewer can see them on screen.
10
+
11
+ ## Narration Tips
12
+
13
+ - Tease the topic, don't summarise it
14
+ - Give one interesting fact that makes the user curious
15
+ - 5-15 seconds per question narration
16
+ - If TTS comes back too long, trim the copy and regenerate
17
+
18
+ ## Research
19
+
20
+ Search for the specific subject, not generic terms ("komodo dragon habitat" not "reptile"). Cross-reference facts - quiz answers must be correct. Look for the surprising angle: what would make someone say "wait, really?"
21
+
22
+ For timeless topics (history, geography, science), write from your own knowledge. For anything recent or uncertain, use web search or clipform_search_news. If neither is available, refuse rather than fabricate.`;
23
+ const MEDIA_WORKFLOW = `## Media Workflow
24
+
25
+ 1. **clipform_generate_tts** - narration audio (returns word-level captions)
26
+ 2. **clipform_search_media** (kind: "image") - find 3 images per question
27
+ 3. **clipform_generate_video** - Ken Burns video from images + audio
28
+ 4. **clipform_upload_question_media** - attach video with captions (set show_captions: true)
29
+
30
+ **Image selection:**
31
+ - ONLY use URLs from clipform_search_media results
32
+ - Search for the specific subject, not generic terms
33
+ - Pick visually distinct images (different angles, colors, subjects)
34
+ - Landscape images work best for pan effects
35
+
36
+ **Slideshow defaults:**
37
+ - 3 images per question, random_effects: true
38
+ - transition: { type: "fade", duration: 1 }
39
+ - Auto focal point detection, eased motion, and cinematic vignette are built in`;
40
+ export function registerResources(server) {
41
+ server.registerResource("guide-quiz", "clipform://guides/quiz", {
42
+ description: "Craft knowledge for writing engaging quizzes - difficulty curves, question psychology, narration style, scoring",
43
+ mimeType: "text/markdown",
44
+ }, async () => ({
45
+ contents: [
46
+ {
47
+ uri: "clipform://guides/quiz",
48
+ mimeType: "text/markdown",
49
+ text: `# Quiz Writing Guide
50
+
51
+ ## Psychology
52
+
53
+ Each question is a micro variable-reward event - the same dopamine loop that keeps people watching. Once someone answers 2-3 questions, sunk cost kicks in and they finish. Viewers mentally compete, then want to compare scores.
54
+
55
+ **Target 50-60% correct.** Too easy = no challenge. Too hard = people feel stupid and won't share.
56
+
57
+ ## Difficulty Curve
58
+
59
+ | Position | Difficulty | Purpose |
60
+ |----------|-----------|---------|
61
+ | Q1-Q2 | Easy (80%+ get right) | Build confidence and commitment |
62
+ | Q3-Q5 | Medium | Peak engagement |
63
+ | Q6-Q8 | Hard (include one "gotcha") | The "everyone gets this wrong" moment |
64
+ | Q9-Q10 | One hard, one satisfying medium | End on a smart feeling, not defeat |
65
+
66
+ ## Question Design
67
+
68
+ - **Myth-busters**: "Sushi means raw fish - True or False?" (False - it means seasoned rice)
69
+ - **Sounds fake but true**: counterintuitive correct answers make people rewatch
70
+ - **Common misconceptions**: "Capital of Australia?" (not Sydney - Canberra)
71
+ - Under 12-15 words per question for mobile readability
72
+ - Trigger gut reactions, not deep thinking
73
+
74
+ ## Wrong Answer Generation
75
+
76
+ For numeric questions (population, speed, weight), scale the real answer by random multipliers (0.3x to 3x) rounded to the same magnitude. Makes wrong answers plausible but clearly different.
77
+
78
+ ## Narration Style
79
+
80
+ You're a quiz master, not a question reader. Each question's narration should:
81
+
82
+ 1. **Tease** - set the scene, build intrigue ("This one catches everyone out")
83
+ 2. **Give context** - one interesting fact that makes the question richer
84
+ 3. **Pose the question** - "So here's the question..."
85
+
86
+ **Don't say:**
87
+ - "You either know it or you don't" (meaningless filler)
88
+ - "This is a really hard one" on every question (loses impact)
89
+ - "Welcome to my quiz" / "Hey guys" (wastes time, skip to Q1)
90
+
91
+ ${WRITING_PRINCIPLES}
92
+
93
+ ${MEDIA_WORKFLOW}`,
94
+ },
95
+ ],
96
+ }));
97
+ server.registerResource("guide-personality-quiz", "clipform://guides/personality-quiz", {
98
+ description: "Craft knowledge for building personality quizzes - category design, option weighting, outcome writing, no right/wrong answers",
99
+ mimeType: "text/markdown",
100
+ }, async () => ({
101
+ contents: [
102
+ {
103
+ uri: "clipform://guides/personality-quiz",
104
+ mimeType: "text/markdown",
105
+ text: `# Personality Quiz Guide
106
+
107
+ ## How it works
108
+
109
+ Personality quizzes use **category-based scoring** (the \`scores\` field on options) instead of right/wrong scoring. Each option distributes points across outcome categories. The category with the highest total at the end determines the result.
110
+
111
+ ## Category Design
112
+
113
+ - **3-5 categories** is the sweet spot. Fewer feels too binary, more feels random.
114
+ - Categories should be **distinct but equally appealing**. Nobody wants to get the "bad" result.
115
+ - Name them after the outcome, not the trait: "Explorer" not "Adventurous", "The Architect" not "Organised".
116
+
117
+ ## Option Weighting
118
+
119
+ Each option scores into one or more categories:
120
+
121
+ \`\`\`json
122
+ { "scores": { "Explorer": 3, "Homebody": 0, "Foodie": 1 } }
123
+ \`\`\`
124
+
125
+ Guidelines:
126
+ - **Primary category**: 2-3 points (this is the option's "home" category)
127
+ - **Secondary**: 1 point (slight lean towards another category)
128
+ - **Unrelated**: 0 (omit or set to 0)
129
+ - **Knockout**: -1 (use sparingly - strongly rules out a category)
130
+ - Every option should score positively in at least one category
131
+ - Avoid giving every option the same spread - it makes results feel random
132
+
133
+ ## Question Design
134
+
135
+ - Questions should feel **personally revealing** but low-stakes: "Pick your ideal Saturday morning" not "What's your biggest weakness?"
136
+ - Scenario-based questions work better than abstract preference questions
137
+ - Each question should meaningfully differentiate between categories
138
+ - Avoid questions where all options clearly map to one obvious personality
139
+
140
+ ## Outcome Screens
141
+
142
+ Each category needs a \`scoring_results\` entry on the end screen:
143
+
144
+ - **Title**: "You're a [Category]!" - celebratory, not clinical
145
+ - **Message**: 2-3 sentences that feel like a personalised insight. Reference specific traits the quiz measured.
146
+ - **Optional CTA**: link to relevant content, product, or next step
147
+
148
+ ## Narration Style
149
+
150
+ Reflective and curious, not quizmaster-y:
151
+ - "This one says a lot about you..."
152
+ - "There's no wrong answer here - go with your gut"
153
+ - "What does your choice reveal?"
154
+
155
+ Do NOT say "let's see if you get this right" - there is no right answer.
156
+
157
+ ${WRITING_PRINCIPLES}
158
+
159
+ ${MEDIA_WORKFLOW}`,
160
+ },
161
+ ],
162
+ }));
163
+ server.registerResource("guide-interview", "clipform://guides/interview", {
164
+ description: "Craft knowledge for building interview and testimonial collection forms - warm-up pacing, open questions, consent, video responses",
165
+ mimeType: "text/markdown",
166
+ }, async () => ({
167
+ contents: [
168
+ {
169
+ uri: "clipform://guides/interview",
170
+ mimeType: "text/markdown",
171
+ text: `# Interview & Testimonial Guide
172
+
173
+ ## Purpose
174
+
175
+ Collect responses from people - testimonials, case studies, journalist callouts, async video interviews, candidate screening. The common thread: you're asking someone to respond on camera or in their own words.
176
+
177
+ ## Structure
178
+
179
+ 1. **Warm-up question** - something easy and low-stakes to get them comfortable. "Tell us your name and what you do" or "What's your role?"
180
+ 2. **Core questions** - the real ask. Open-ended, one topic per question. Don't over-split - 2-3 core questions max.
181
+ 3. **Follow-up** (optional) - "Anything else you'd like to add?" catches things you didn't think to ask.
182
+ 4. **Contact collection** - first name + email minimum. Add phone/company if relevant.
183
+ 5. **Consent** - "I agree that my response may be used in [context]." Always include for testimonials and media.
184
+ 6. **End screen** - set expectations: "Thanks! We'll be in touch if we'd like to take things further."
185
+
186
+ ## Question Design
187
+
188
+ - **Open-ended by default.** Use "open" type with text + audio + video response enabled. Let the respondent choose their format.
189
+ - **One topic per question.** "Tell us about your experience AND what you'd change" is two questions.
190
+ - **Prompt, don't interrogate.** "What surprised you most about working with us?" beats "Rate your satisfaction."
191
+ - **Keep it short.** 3-5 questions total. Every extra question loses respondents.
192
+
193
+ ## Narration for Interviews
194
+
195
+ Warmer and more personal than quiz narration. You're inviting someone to share, not testing them.
196
+
197
+ - "We'd love to hear your story..."
198
+ - "Take your time with this one - there's no wrong answer"
199
+ - Keep narration under 10 seconds - the respondent's answer is the content, not yours
200
+
201
+ ## Settings
202
+
203
+ - disable_back_navigation: false (let people review their answers)
204
+ - show_step_counter: true (so they know how much is left)
205
+
206
+ ${WRITING_PRINCIPLES}
207
+
208
+ ${MEDIA_WORKFLOW}`,
209
+ },
210
+ ],
211
+ }));
212
+ server.registerResource("guide-survey", "clipform://guides/survey", {
213
+ description: "Craft knowledge for feedback surveys, NPS, and research forms - brevity, rating scales, respondent fatigue",
214
+ mimeType: "text/markdown",
215
+ }, async () => ({
216
+ contents: [
217
+ {
218
+ uri: "clipform://guides/survey",
219
+ mimeType: "text/markdown",
220
+ text: `# Survey & Feedback Guide
221
+
222
+ ## Purpose
223
+
224
+ Collect structured feedback - NPS, customer satisfaction, product research, post-event feedback. The goal is clean, analysable data with minimal respondent fatigue.
225
+
226
+ ## Structure
227
+
228
+ Surveys should be ruthlessly short. Every extra question costs you completions.
229
+
230
+ 1. **Key metric** - the one number you care about (NPS, satisfaction rating, likelihood to recommend). Put it first while attention is highest.
231
+ 2. **Follow-up** - one open-ended "why?" question. "What's the main reason for your score?" This is where the insight lives.
232
+ 3. **Specific questions** (optional) - 2-3 targeted choice questions on specific areas. Don't fish - only ask what you'll act on.
233
+ 4. **Contact** (optional) - only if you need to follow up. Many surveys are better anonymous.
234
+ 5. **End screen** - "Thanks for your feedback!" Keep it simple.
235
+
236
+ ## Question Design
237
+
238
+ - **Choice questions for data, open questions for insight.** Don't use open-ended where a rating scale would do, and don't use ratings where you need to understand why.
239
+ - **Balanced scales.** Equal positive and negative options. "Excellent / Good / Fair / Poor" not "Amazing / Great / Good / OK / Bad."
240
+ - **No leading questions.** "How much did you enjoy...?" assumes they enjoyed it.
241
+ - **5 questions max.** If you need more, you're running research, not a survey - split it up.
242
+
243
+ ## Narration for Surveys
244
+
245
+ Optional - many surveys work fine as text only. If using narration:
246
+
247
+ - Keep it brief (5-8 seconds). "We'd love your quick feedback on..."
248
+ - Don't narrate every question - just the opener to set the tone
249
+ - Friendly but efficient. Respect their time.
250
+
251
+ ## Settings
252
+
253
+ - disable_back_navigation: false
254
+ - show_step_counter: true (shows progress, reduces abandonment)
255
+
256
+ ${WRITING_PRINCIPLES}`,
257
+ },
258
+ ],
259
+ }));
260
+ server.registerResource("guide-funnel", "clipform://guides/funnel", {
261
+ description: "Craft knowledge for lead qualification funnels and product recommendation quizzes - branching logic, progressive profiling, conversion",
262
+ mimeType: "text/markdown",
263
+ }, async () => ({
264
+ contents: [
265
+ {
266
+ uri: "clipform://guides/funnel",
267
+ mimeType: "text/markdown",
268
+ text: `# Lead Qualification & Product Recommendation Guide
269
+
270
+ ## Purpose
271
+
272
+ Route people to the right outcome based on their answers. Lead qualification scores and segments prospects. Product recommendation guides users to the right product. Both use branching logic to personalise the journey.
273
+
274
+ ## Structure
275
+
276
+ 1. **Hook question** - immediately relevant, low friction. "What are you looking for?" or "What best describes you?" This segments the user and determines the branch.
277
+ 2. **Qualifying questions** - 2-3 questions that narrow down the need. Each answer can branch to a different path.
278
+ 3. **Contact capture** - name, email, phone. Place AFTER qualifying questions so they've invested before you ask for details.
279
+ 4. **Outcome screen** - personalised end screen based on their answers. Use score_ranges or branching logic to show different messages.
280
+
281
+ ## Question Design
282
+
283
+ - **Progressive profiling.** Start broad, get specific. Don't ask for budget on question 1.
284
+ - **Every question must earn its place.** If the answer doesn't change the outcome or routing, cut the question.
285
+ - **Choice questions, not open-ended.** You need structured data to route and score. Save open-ended for "anything else?"
286
+ - **3-5 questions max.** Every extra step loses leads. The funnel is leaky by nature - keep it tight.
287
+
288
+ ## Branching Logic
289
+
290
+ Use clipform_set_question_logic to route based on answers:
291
+
292
+ - **Segment early.** Q1 answer determines which Q2 they see.
293
+ - **Converge at capture.** All branches should reach the contact collection step.
294
+ - **Different outcomes for different segments.** The end screen should feel personalised: "Based on your answers, we recommend..." not a generic "Thanks!"
295
+
296
+ ## Scoring for Product Recommendation
297
+
298
+ - Assign scores to each option based on which product/outcome it points to
299
+ - Use score_ranges on the end screen to show different recommendations
300
+ - Example: score 0-3 = "Basic plan", 4-6 = "Pro plan", 7+ = "Enterprise - let's talk"
301
+
302
+ ## Narration for Funnels
303
+
304
+ Short and action-oriented. You're guiding, not teaching.
305
+
306
+ - "Let's find the right fit for you..."
307
+ - "Just a couple of quick questions..."
308
+ - Keep total narration under 30 seconds across the whole funnel
309
+
310
+ ## Settings
311
+
312
+ - disable_back_navigation: true (prevent answer shopping that breaks scoring)
313
+ - show_step_counter: false (funnels feel shorter without a counter)
314
+
315
+ ${WRITING_PRINCIPLES}`,
316
+ },
317
+ ],
318
+ }));
319
+ server.registerResource("context-session", "clipform://context/session", {
320
+ description: "Current session info: auth mode, workspace, plan tier, question limits, feature flags. Read this before planning content to know your constraints.",
321
+ mimeType: "text/markdown",
322
+ annotations: { audience: ["assistant"], priority: 1.0 },
323
+ }, async () => {
324
+ const text = await getSessionContext();
325
+ return {
326
+ contents: [
327
+ {
328
+ uri: "clipform://context/session",
329
+ mimeType: "text/markdown",
330
+ text: text || "Session context unavailable - API may not be reachable.",
331
+ },
332
+ ],
333
+ };
334
+ });
335
+ }
336
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -26,12 +26,14 @@ import { registerRenderCompositionTool } from "./tools/render-composition.js";
26
26
  import { registerSearchMusicTool } from "./tools/search-music.js";
27
27
  import { registerListCompositionsTool } from "./tools/list-compositions.js";
28
28
  import { registerListAssetsTool } from "./tools/list-assets.js";
29
- // Prompts
29
+ import { registerGenerateVideoTool } from "./tools/generate-video.js";
30
+ // Prompts & Resources
30
31
  import { registerPrompts } from "./prompts.js";
32
+ import { registerResources } from "./resources.js";
31
33
  export function createServer() {
32
34
  const server = new McpServer({
33
35
  name: "clipform-mcp-server",
34
- version: "1.5.0",
36
+ version: "1.5.1",
35
37
  });
36
38
  // Form CRUD
37
39
  registerCreateFormTool(server);
@@ -55,13 +57,15 @@ export function createServer() {
55
57
  // Creative tools
56
58
  registerGenerateTtsTool(server);
57
59
  registerGenerateSlideshowTool(server);
60
+ registerGenerateVideoTool(server);
58
61
  registerSearchMediaTool(server);
59
62
  registerRenderCompositionTool(server);
60
63
  registerSearchMusicTool(server);
61
64
  registerListCompositionsTool(server);
62
65
  registerListAssetsTool(server);
63
- // Prompts
66
+ // Prompts & Resources
64
67
  registerPrompts(server);
68
+ registerResources(server);
65
69
  return server;
66
70
  }
67
71
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -10,8 +10,8 @@ ${QUESTION_TYPES_DESCRIPTION}
10
10
 
11
11
  All type definitions and config schemas are derived from @vid-master/config (answer-types).`,
12
12
  inputSchema: {
13
- form_id: z.string().describe("The form ID"),
14
- edit_token: z.string().describe("The edit token"),
13
+ form_id: z.string().uuid().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
14
+ edit_token: z.string().optional().describe("The edit token. Required for anonymous (non-OAuth) sessions; omit when connected via an authenticated MCP client like claude.ai."),
15
15
  question: QuestionSchema.describe("The question to add"),
16
16
  after_question_id: z
17
17
  .string()
@@ -1 +1 @@
1
- {"version":3,"file":"add-question.js","sourceRoot":"","sources":["../../src/tools/add-question.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE;;EAEjB,0BAA0B;;4FAEgE;QACtF,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACjD,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YACxD,iBAAiB,EAAE,CAAC;iBACjB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,sEAAsE,CACvE;SACJ;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE;QAC7D,MAAM,IAAI,GAA4B,EAAE,QAAQ,EAAE,CAAC;QACnD,IAAI,iBAAiB;YAAE,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAElE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,OAAO,YAAY,EAAE;YAC1D,MAAM,EAAE,MAAM;YACd,IAAI;YACJ,KAAK,EAAE,UAAU;SAClB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CACf;YACE,8BAA8B;YAC9B,gBAAgB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;YACzC,SAAS,QAAQ,CAAC,IAAI,EAAE;YACxB,WAAW,QAAQ,CAAC,MAAM,EAAE;SAC7B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"add-question.js","sourceRoot":"","sources":["../../src/tools/add-question.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE;;EAEjB,0BAA0B;;4FAEgE;QACtF,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,uFAAuF,CAAC;YAC5H,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kIAAkI,CAAC;YAC9K,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YACxD,iBAAiB,EAAE,CAAC;iBACjB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,sEAAsE,CACvE;SACJ;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE;QAC7D,MAAM,IAAI,GAA4B,EAAE,QAAQ,EAAE,CAAC;QACnD,IAAI,iBAAiB;YAAE,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAElE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,OAAO,YAAY,EAAE;YAC1D,MAAM,EAAE,MAAM;YACd,IAAI;YACJ,KAAK,EAAE,UAAU;SAClB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CACf;YACE,8BAA8B;YAC9B,gBAAgB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;YACzC,SAAS,QAAQ,CAAC,IAAI,EAAE;YACxB,WAAW,QAAQ,CAAC,MAAM,EAAE;SAC7B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -5,8 +5,8 @@ export function registerAttachQuestionAudioTool(server) {
5
5
  title: "Attach Audio to Question",
6
6
  description: `Attach a sound effect or audio file to a question with existing media (stills only). The audio auto-plays once when a respondent reaches this question. Provide a public URL to the audio file (WAV, MP3, or OGG). The question must already have media uploaded (use clipform_upload_question_media first).`,
7
7
  inputSchema: {
8
- form_id: z.string().describe("The form ID"),
9
- edit_token: z.string().describe("The edit token"),
8
+ form_id: z.string().uuid().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
9
+ edit_token: z.string().optional().describe("The edit token. Required for anonymous (non-OAuth) sessions; omit when connected via an authenticated MCP client like claude.ai."),
10
10
  question_id: z
11
11
  .string()
12
12
  .describe("The question ID (must already have media attached)"),
@@ -1 +1 @@
1
- {"version":3,"file":"attach-question-audio.js","sourceRoot":"","sources":["../../src/tools/attach-question-audio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,+BAA+B,CAAC,MAAiB;IAC/D,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,8SAA8S;QAC3T,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACjD,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,CAAC,oDAAoD,CAAC;YACjE,GAAG,EAAE,CAAC;iBACH,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,CAAC,iDAAiD,CAAC;SAC/D;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,cAAc,WAAW,QAAQ,EAClD;YACE,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,EAAE,GAAG,EAAE;SACd,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CACf,8BAA8B,WAAW,KAAK;YAC5C,eAAe,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAClD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"attach-question-audio.js","sourceRoot":"","sources":["../../src/tools/attach-question-audio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,+BAA+B,CAAC,MAAiB;IAC/D,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,8SAA8S;QAC3T,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,uFAAuF,CAAC;YAC5H,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kIAAkI,CAAC;YAC9K,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,CAAC,oDAAoD,CAAC;YACjE,GAAG,EAAE,CAAC;iBACH,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,CAAC,iDAAiD,CAAC;SAC/D;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,cAAc,WAAW,QAAQ,EAClD;YACE,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,EAAE,GAAG,EAAE;SACd,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CACf,8BAA8B,WAAW,KAAK;YAC5C,eAAe,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAClD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,10 +1,11 @@
1
1
  import { z } from "zod";
2
+ import { BUSINESS } from "@vid-master/config";
2
3
  import { QuestionSchema, QUESTION_TYPES_DESCRIPTION, } from "../lib/schemas.js";
3
4
  import { callApi, errorResult, textResult } from "../lib/api-client.js";
4
5
  export function registerCreateFormTool(server) {
5
6
  server.registerTool("clipform_create_form", {
6
7
  title: "Create Clipform",
7
- description: `Create a new Clipform (interactive video-style form). Returns a claim URL and an edit_token for further modifications.
8
+ description: `Create a new Clipform (interactive video-style form). Returns a viewer URL plus, for anonymous (non-OAuth) sessions, an edit_token and claim URL. When connected via an authenticated MCP client (e.g. claude.ai), the form lands directly in the user's workspace and no edit_token is issued.
8
9
 
9
10
  ${QUESTION_TYPES_DESCRIPTION}
10
11
 
@@ -57,6 +58,33 @@ Example: A form that asks a question, collects contact info, then finishes:
57
58
  openWorldHint: true,
58
59
  },
59
60
  }, async ({ title, questions, show_step_counter, disable_back_navigation, primary_color, background_color, font_family, embed_autoplay }) => {
61
+ // 0. Pre-flight: resolve the caller's plan and reject up-front if the
62
+ // requested question count exceeds it. Without this we'd build a
63
+ // scaffold + N-1 questions, then 403 on the Nth, leaving an orphan.
64
+ // /v1/me is the single source for plan info; PLAN_LIMITS lives in
65
+ // @vid-master/config and is read there. The MCP tool is intentionally
66
+ // thin and never duplicates limit numbers.
67
+ let planContext = null;
68
+ const meResult = await callApi("/me", { method: "GET" });
69
+ if (meResult.ok) {
70
+ const me = meResult.data;
71
+ planContext = {
72
+ auth_mode: me.auth_mode,
73
+ workspace_name: me.workspace?.name ?? null,
74
+ plan_name: me.plan?.name ?? "Free",
75
+ node_limit: me.plan?.node_limit ?? null,
76
+ };
77
+ // questions includes any end_screen the user supplied; the scaffold
78
+ // already has one so we count "real" content nodes only.
79
+ const contentCount = questions.filter((q) => q.type !== "end_screen").length;
80
+ if (planContext.node_limit !== null && contentCount > planContext.node_limit) {
81
+ const upgradeUrl = `${BUSINESS.urls.dashboard}/billing`;
82
+ const message = planContext.auth_mode === "oauth"
83
+ ? `Your '${planContext.workspace_name}' workspace is on the ${planContext.plan_name} plan, capped at ${planContext.node_limit} questions per form. You asked for ${contentCount}. Either rerun with ${planContext.node_limit} questions or upgrade at ${upgradeUrl}.`
84
+ : `Anonymous sessions are capped at ${planContext.node_limit} questions per form (${planContext.plan_name} plan). You asked for ${contentCount}. Either rerun with ${planContext.node_limit} questions, or connect your Clipform account in claude.ai → Settings → Connectors so forms land in your workspace with your real plan limits.`;
85
+ return errorResult(message);
86
+ }
87
+ }
60
88
  // 1. Create bare scaffold
61
89
  const createResult = await callApi("/forms", {
62
90
  method: "POST",
@@ -67,7 +95,11 @@ Example: A form that asks a question, collects contact info, then finishes:
67
95
  }
68
96
  const { data } = createResult;
69
97
  const formId = data.form_id;
70
- const editToken = data.edit_token;
98
+ // edit_token is null when the request is OAuth-authenticated (the user
99
+ // owns the form via their workspace and no per-form secret is needed).
100
+ // For anonymous local sessions it carries the per-form capability token.
101
+ const editToken = data.edit_token ?? undefined;
102
+ const claimUrl = data.claim_url ?? undefined;
71
103
  // 2. Apply form settings and theme if provided
72
104
  const settingsBody = {};
73
105
  if (show_step_counter !== undefined)
@@ -127,20 +159,41 @@ Example: A form that asks a question, collects contact info, then finishes:
127
159
  body: { is_published: true },
128
160
  token: editToken,
129
161
  });
130
- return textResult([
162
+ const lines = [
131
163
  `Form created successfully!`,
132
164
  ``,
133
165
  `Title: ${title}`,
134
166
  `Questions: ${questions.length}`,
135
- `Edit Token: ${editToken}`,
136
- ``,
137
- `FORM URL (share this with respondents): ${data.viewer_url}`,
138
- `CLAIM URL (transfer ownership to your account): ${data.claim_url}`,
139
- ``,
140
- `IMPORTANT: Always show the user the exact URLs above — do not rewrite or modify them.`,
141
- `Save the edit_token — you need it for all subsequent operations.`,
142
- `The token expires when the user claims the form via the claim URL.`,
143
- ].join("\n"));
167
+ `Form ID: ${formId}`,
168
+ ];
169
+ if (editToken) {
170
+ lines.push(`Edit Token: ${editToken}`);
171
+ }
172
+ lines.push(``, `FORM URL (share this with respondents): ${data.viewer_url}`);
173
+ if (claimUrl) {
174
+ lines.push(`CLAIM URL (transfer ownership to your account): ${claimUrl}`);
175
+ }
176
+ lines.push(``, `IMPORTANT: Always show the user the exact URLs above — do not rewrite or modify them.`);
177
+ if (editToken) {
178
+ lines.push(`Save the form_id and edit_token — you need both for all subsequent operations (get_form, add_question, upload_question_media, etc.).`, `The token expires when the user claims the form via the claim URL.`);
179
+ }
180
+ else {
181
+ lines.push(`The form is owned by your workspace - pass form_id alone on follow-up tools.`);
182
+ }
183
+ // One-line plan/auth summary so the model can mention it ONCE and not
184
+ // re-prompt on every follow-up call.
185
+ if (planContext) {
186
+ const limitNote = planContext.node_limit === null
187
+ ? "unlimited questions"
188
+ : `up to ${planContext.node_limit} questions per form`;
189
+ if (planContext.auth_mode === "oauth") {
190
+ lines.push(``, `Plan: ${planContext.plan_name} (${limitNote}) in workspace '${planContext.workspace_name}'.`);
191
+ }
192
+ else {
193
+ lines.push(``, `Plan: anonymous ${planContext.plan_name} (${limitNote}). Mention this once: the user can connect their Clipform account in claude.ai → Settings → Connectors → ${BUSINESS.urls.mcp} so future forms land directly in their workspace - do not repeat on follow-up calls.`);
194
+ }
195
+ }
196
+ return textResult(lines.join("\n"));
144
197
  });
145
198
  }
146
199
  //# sourceMappingURL=create-form.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-form.js","sourceRoot":"","sources":["../../src/tools/create-form.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-form.js","sourceRoot":"","sources":["../../src/tools/create-form.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,cAAc,EACd,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE;;EAEjB,0BAA0B;;;;;;;;;;;;EAY1B;QACI,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;YACxC,SAAS,EAAE,CAAC;iBACT,KAAK,CAAC,cAAc,CAAC;iBACrB,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,iCAAiC,CAAC;YAC9C,iBAAiB,EAAE,CAAC;iBACjB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,uDAAuD,CAAC;YACpE,uBAAuB,EAAE,CAAC;iBACvB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,2CAA2C,CAAC;YACxD,aAAa,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,uEAAuE,CAAC;YACpF,gBAAgB,EAAE,CAAC;iBAChB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,6CAA6C,CAAC;YAC1D,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,gEAAgE,CAAC;YAC7E,cAAc,EAAE,CAAC;iBACd,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,kGAAkG,CAAC;SAChH;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,EAAE;QACvI,sEAAsE;QACtE,iEAAiE;QACjE,oEAAoE;QACpE,kEAAkE;QAClE,sEAAsE;QACtE,2CAA2C;QAC3C,IAAI,WAAW,GAKJ,IAAI,CAAC;QAChB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAW,CAAC;YAChC,WAAW,GAAG;gBACZ,SAAS,EAAE,EAAE,CAAC,SAAS;gBACvB,cAAc,EAAE,EAAE,CAAC,SAAS,EAAE,IAAI,IAAI,IAAI;gBAC1C,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,IAAI,MAAM;gBAClC,UAAU,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,IAAI,IAAI;aACxC,CAAC;YAEF,oEAAoE;YACpE,yDAAyD;YACzD,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,MAAM,CAAC;YAE7E,IAAI,WAAW,CAAC,UAAU,KAAK,IAAI,IAAI,YAAY,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC;gBAC7E,MAAM,UAAU,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC;gBACxD,MAAM,OAAO,GACX,WAAW,CAAC,SAAS,KAAK,OAAO;oBAC/B,CAAC,CAAC,SAAS,WAAW,CAAC,cAAc,yBAAyB,WAAW,CAAC,SAAS,oBAAoB,WAAW,CAAC,UAAU,sCAAsC,YAAY,uBAAuB,WAAW,CAAC,UAAU,4BAA4B,UAAU,GAAG;oBACrQ,CAAC,CAAC,oCAAoC,WAAW,CAAC,UAAU,wBAAwB,WAAW,CAAC,SAAS,yBAAyB,YAAY,uBAAuB,WAAW,CAAC,UAAU,+IAA+I,CAAC;gBAC/U,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,KAAK,EAAE;SAChB,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;YACrB,OAAO,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAiB,CAAC;QACtC,uEAAuE;QACvE,uEAAuE;QACvE,yEAAyE;QACzE,MAAM,SAAS,GAAI,IAAI,CAAC,UAA4B,IAAI,SAAS,CAAC;QAClE,MAAM,QAAQ,GAAI,IAAI,CAAC,SAA2B,IAAI,SAAS,CAAC;QAEhE,+CAA+C;QAC/C,MAAM,YAAY,GAA4B,EAAE,CAAC;QACjD,IAAI,iBAAiB,KAAK,SAAS;YAAE,YAAY,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QACxF,IAAI,uBAAuB,KAAK,SAAS;YAAE,YAAY,CAAC,uBAAuB,GAAG,uBAAuB,CAAC;QAC1G,IAAI,aAAa,KAAK,SAAS;YAAE,YAAY,CAAC,aAAa,GAAG,aAAa,CAAC;QAC5E,IAAI,gBAAgB,KAAK,SAAS;YAAE,YAAY,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACrF,IAAI,WAAW,KAAK,SAAS;YAAE,YAAY,CAAC,WAAW,GAAG,WAAW,CAAC;QACtE,IAAI,cAAc,KAAK,SAAS;YAAE,YAAY,CAAC,cAAc,GAAG,cAAc,CAAC;QAE/E,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,OAAO,CAAC,UAAU,MAAM,EAAE,EAAE;gBAChC,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;QACL,CAAC;QAED,qDAAqD;QACrD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,0EAA0E;YAC1E,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC5B,yEAAyE;gBACzE,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,UAAU,MAAM,EAAE,EAAE;oBAClD,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,SAAS;iBACjB,CAAC,CAAC;gBACH,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,cAAc,GAAI,SAAS,CAAC,IAAY,CAAC,SAA8B,CAAC;oBAC9E,MAAM,SAAS,GAAG,cAAc,EAAE,IAAI,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;oBAC9E,IAAI,SAAS,EAAE,CAAC;wBACd,MAAM,OAAO,CAAC,UAAU,MAAM,cAAc,SAAS,CAAC,EAAE,EAAE,EAAE;4BAC1D,MAAM,EAAE,OAAO;4BACf,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;4BACrE,KAAK,EAAE,SAAS;yBACjB,CAAC,CAAC;wBACH,SAAS;oBACX,CAAC;gBACH,CAAC;gBACD,4DAA4D;YAC9D,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,UAAU,MAAM,YAAY,EAAE;gBAC5D,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;gBACrB,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;gBAClB,OAAO,WAAW,CAAC,2BAA2B,CAAC,CAAC,MAAM,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,MAAM,OAAO,CAAC,UAAU,MAAM,EAAE,EAAE;YAChC,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;YAC5B,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG;YACZ,4BAA4B;YAC5B,EAAE;YACF,UAAU,KAAK,EAAE;YACjB,cAAc,SAAS,CAAC,MAAM,EAAE;YAChC,YAAY,MAAM,EAAE;SACrB,CAAC;QAEF,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,eAAe,SAAS,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,2CAA2C,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAE7E,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,mDAAmD,QAAQ,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,KAAK,CAAC,IAAI,CACR,EAAE,EACF,uFAAuF,CACxF,CAAC;QAEF,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CACR,sIAAsI,EACtI,oEAAoE,CACrE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CACR,8EAA8E,CAC/E,CAAC;QACJ,CAAC;QAED,sEAAsE;QACtE,qCAAqC;QACrC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,SAAS,GACb,WAAW,CAAC,UAAU,KAAK,IAAI;gBAC7B,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,SAAS,WAAW,CAAC,UAAU,qBAAqB,CAAC;YAC3D,IAAI,WAAW,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CACR,EAAE,EACF,SAAS,WAAW,CAAC,SAAS,KAAK,SAAS,mBAAmB,WAAW,CAAC,cAAc,IAAI,CAC9F,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CACR,EAAE,EACF,mBAAmB,WAAW,CAAC,SAAS,KAAK,SAAS,4GAA4G,QAAQ,CAAC,IAAI,CAAC,GAAG,uFAAuF,CAC3Q,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -5,8 +5,8 @@ export function registerDeleteFormTool(server) {
5
5
  title: "Delete Clipform",
6
6
  description: `Permanently delete an unclaimed form and all its questions. This cannot be undone. Only works on forms that haven't been claimed yet.`,
7
7
  inputSchema: {
8
- form_id: z.string().describe("The form ID to delete"),
9
- edit_token: z.string().describe("The edit token"),
8
+ form_id: z.string().uuid().describe("The form UUID to delete (returned by clipform_create_form, not the short share_id from the URL)"),
9
+ edit_token: z.string().optional().describe("The edit token. Required for anonymous (non-OAuth) sessions; omit when connected via an authenticated MCP client like claude.ai."),
10
10
  },
11
11
  annotations: {
12
12
  readOnlyHint: false,
@@ -1 +1 @@
1
- {"version":3,"file":"delete-form.js","sourceRoot":"","sources":["../../src/tools/delete-form.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,uIAAuI;QACpJ,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACrD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;SAClD;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE;QAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,OAAO,EAAE,EAAE;YAChD,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,UAAU;SAClB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CAAC,QAAQ,OAAO,gCAAgC,CAAC,CAAC;IACrE,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"delete-form.js","sourceRoot":"","sources":["../../src/tools/delete-form.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,uIAAuI;QACpJ,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,iGAAiG,CAAC;YACtI,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kIAAkI,CAAC;SAC/K;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE;QAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,OAAO,EAAE,EAAE;YAChD,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,UAAU;SAClB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CAAC,QAAQ,OAAO,gCAAgC,CAAC,CAAC;IACrE,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -5,8 +5,8 @@ export function registerDeleteQuestionMediaTool(server) {
5
5
  title: "Delete Question Media",
6
6
  description: `Remove media from a question. Deletes the media record and cleans up external resources (Mux video asset, storage file).`,
7
7
  inputSchema: {
8
- form_id: z.string().describe("The form ID"),
9
- edit_token: z.string().describe("The edit token"),
8
+ form_id: z.string().uuid().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
9
+ edit_token: z.string().optional().describe("The edit token. Required for anonymous (non-OAuth) sessions; omit when connected via an authenticated MCP client like claude.ai."),
10
10
  question_id: z.string().describe("The question ID"),
11
11
  },
12
12
  annotations: {
@@ -1 +1 @@
1
- {"version":3,"file":"delete-question-media.js","sourceRoot":"","sources":["../../src/tools/delete-question-media.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,+BAA+B,CAAC,MAAiB;IAC/D,MAAM,CAAC,YAAY,CACjB,gCAAgC,EAChC;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,0HAA0H;QACvI,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACjD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;SACpD;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,cAAc,WAAW,QAAQ,EAClD;YACE,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,UAAU;SAClB,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CAAC,8BAA8B,CAAC,CAAC;IACpD,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"delete-question-media.js","sourceRoot":"","sources":["../../src/tools/delete-question-media.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,+BAA+B,CAAC,MAAiB;IAC/D,MAAM,CAAC,YAAY,CACjB,gCAAgC,EAChC;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,0HAA0H;QACvI,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,uFAAuF,CAAC;YAC5H,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kIAAkI,CAAC;YAC9K,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;SACpD;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,cAAc,WAAW,QAAQ,EAClD;YACE,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,UAAU;SAClB,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CAAC,8BAA8B,CAAC,CAAC;IACpD,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -5,8 +5,8 @@ export function registerDeleteQuestionTool(server) {
5
5
  title: "Delete Question",
6
6
  description: `Delete a question from a form. The logic chain is automatically re-linked (the previous question will point to the next one). Cannot delete the start node or the last end screen.`,
7
7
  inputSchema: {
8
- form_id: z.string().describe("The form ID"),
9
- edit_token: z.string().describe("The edit token"),
8
+ form_id: z.string().uuid().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
9
+ edit_token: z.string().optional().describe("The edit token. Required for anonymous (non-OAuth) sessions; omit when connected via an authenticated MCP client like claude.ai."),
10
10
  question_id: z.string().describe("The question ID to delete"),
11
11
  },
12
12
  annotations: {
@@ -1 +1 @@
1
- {"version":3,"file":"delete-question.js","sourceRoot":"","sources":["../../src/tools/delete-question.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,oLAAoL;QACjM,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACjD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;SAC9D;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,cAAc,WAAW,EAAE,EAC5C;YACE,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,UAAU;SAClB,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CACf,YAAY,WAAW,+CAA+C,CACvE,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"delete-question.js","sourceRoot":"","sources":["../../src/tools/delete-question.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,oLAAoL;QACjM,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,uFAAuF,CAAC;YAC5H,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kIAAkI,CAAC;YAC9K,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;SAC9D;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,cAAc,WAAW,EAAE,EAC5C;YACE,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,UAAU;SAClB,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CACf,YAAY,WAAW,+CAA+C,CACvE,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}