@clipform/mcp-server 1.7.0 → 1.8.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 (87) hide show
  1. package/README.md +42 -29
  2. package/dist/__tests__/api-parity.test.js +31 -22
  3. package/dist/__tests__/api-parity.test.js.map +1 -1
  4. package/dist/index.js +9 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/api-client.d.ts +2 -0
  7. package/dist/lib/api-client.js +10 -0
  8. package/dist/lib/api-client.js.map +1 -1
  9. package/dist/lib/format-form.d.ts +2 -0
  10. package/dist/lib/format-form.js +32 -0
  11. package/dist/lib/format-form.js.map +1 -0
  12. package/dist/lib/render-jobs.d.ts +13 -0
  13. package/dist/lib/render-jobs.js +38 -0
  14. package/dist/lib/render-jobs.js.map +1 -0
  15. package/dist/lib/schemas.d.ts +4 -4
  16. package/dist/lib/schemas.js +11 -11
  17. package/dist/lib/schemas.js.map +1 -1
  18. package/dist/lib/session-context.js +9 -3
  19. package/dist/lib/session-context.js.map +1 -1
  20. package/dist/prompts.js +31 -10
  21. package/dist/prompts.js.map +1 -1
  22. package/dist/resources.js +3 -3
  23. package/dist/resources.js.map +1 -1
  24. package/dist/server.js +23 -21
  25. package/dist/server.js.map +1 -1
  26. package/dist/tools/add-node.d.ts +2 -0
  27. package/dist/tools/add-node.js +50 -0
  28. package/dist/tools/add-node.js.map +1 -0
  29. package/dist/tools/attach-node-audio.d.ts +2 -0
  30. package/dist/tools/{attach-question-audio.js → attach-node-audio.js} +9 -9
  31. package/dist/tools/attach-node-audio.js.map +1 -0
  32. package/dist/tools/{add-question.d.ts → check-render.d.ts} +1 -1
  33. package/dist/tools/check-render.js +47 -0
  34. package/dist/tools/check-render.js.map +1 -0
  35. package/dist/tools/create-form.js +43 -25
  36. package/dist/tools/create-form.js.map +1 -1
  37. package/dist/tools/delete-node-media.d.ts +2 -0
  38. package/dist/tools/{delete-question-media.js → delete-node-media.js} +9 -9
  39. package/dist/tools/delete-node-media.js.map +1 -0
  40. package/dist/tools/delete-node.d.ts +2 -0
  41. package/dist/tools/delete-node.js +32 -0
  42. package/dist/tools/delete-node.js.map +1 -0
  43. package/dist/tools/generate-slideshow.js +16 -10
  44. package/dist/tools/generate-slideshow.js.map +1 -1
  45. package/dist/tools/generate-tts.js +55 -31
  46. package/dist/tools/generate-tts.js.map +1 -1
  47. package/dist/tools/generate-video.js +17 -11
  48. package/dist/tools/generate-video.js.map +1 -1
  49. package/dist/tools/get-form.js +4 -25
  50. package/dist/tools/get-form.js.map +1 -1
  51. package/dist/tools/get-node-media.d.ts +2 -0
  52. package/dist/tools/{get-question-media.js → get-node-media.js} +9 -9
  53. package/dist/tools/get-node-media.js.map +1 -0
  54. package/dist/tools/render-composition.js +18 -13
  55. package/dist/tools/render-composition.js.map +1 -1
  56. package/dist/tools/search-media.js +1 -1
  57. package/dist/tools/search-media.js.map +1 -1
  58. package/dist/tools/set-node-logic.d.ts +2 -0
  59. package/dist/tools/{set-question-logic.js → set-node-logic.js} +18 -16
  60. package/dist/tools/set-node-logic.js.map +1 -0
  61. package/dist/tools/update-form.js +4 -1
  62. package/dist/tools/update-form.js.map +1 -1
  63. package/dist/tools/update-node.d.ts +2 -0
  64. package/dist/tools/{update-question.js → update-node.js} +14 -11
  65. package/dist/tools/update-node.js.map +1 -0
  66. package/dist/tools/upload-node-media.d.ts +2 -0
  67. package/dist/tools/upload-node-media.js +109 -0
  68. package/dist/tools/upload-node-media.js.map +1 -0
  69. package/package.json +1 -1
  70. package/dist/tools/add-question.js +0 -47
  71. package/dist/tools/add-question.js.map +0 -1
  72. package/dist/tools/attach-question-audio.d.ts +0 -2
  73. package/dist/tools/attach-question-audio.js.map +0 -1
  74. package/dist/tools/delete-question-media.d.ts +0 -2
  75. package/dist/tools/delete-question-media.js.map +0 -1
  76. package/dist/tools/delete-question.d.ts +0 -2
  77. package/dist/tools/delete-question.js +0 -29
  78. package/dist/tools/delete-question.js.map +0 -1
  79. package/dist/tools/get-question-media.d.ts +0 -2
  80. package/dist/tools/get-question-media.js.map +0 -1
  81. package/dist/tools/set-question-logic.d.ts +0 -2
  82. package/dist/tools/set-question-logic.js.map +0 -1
  83. package/dist/tools/update-question.d.ts +0 -2
  84. package/dist/tools/update-question.js.map +0 -1
  85. package/dist/tools/upload-question-media.d.ts +0 -2
  86. package/dist/tools/upload-question-media.js +0 -77
  87. package/dist/tools/upload-question-media.js.map +0 -1
package/dist/prompts.js CHANGED
@@ -27,7 +27,7 @@ export function registerPrompts(server) {
27
27
  3. **Create the form** with clipform_create_form:
28
28
  - show_step_counter: true
29
29
  - disable_back_navigation: true
30
- 4. **Add questions** with clipform_add_question (type: "choice"):
30
+ 4. **Add questions** with clipform_add_node (type: "choice"):
31
31
  - config: { choice: { show_answer_feedback: true } }
32
32
  - randomise_options: true in config
33
33
  - score: 1 on correct option, score: 0 on wrong
@@ -36,10 +36,20 @@ export function registerPrompts(server) {
36
36
  6. **Build video** for each question:
37
37
  - clipform_search_media (kind: "image") - 3 images per question
38
38
  - clipform_generate_video - creates Ken Burns video synced to audio
39
- 7. **Attach media** with clipform_upload_question_media. Include captions, set show_captions: true.
40
- 8. **Update end screen** - set show_score: true, icon: "trophy", and score_ranges for personalised messages
39
+ 7. **Attach media** with clipform_upload_node_media. Include captions, set show_captions: true.
40
+ 8. **Update end screen** with clipform_update_node - EVERY quiz must have:
41
+ - show_score: true, icon: "trophy"
42
+ - show_share_button: true (drives virality)
43
+ - cta_type: "restart", cta_text: a short challenge like "Beat your score?" or "Try again?"
44
+ - score_ranges with personalised title + message per tier. Write these in the quiz's voice - short, punchy, and specific to the topic (not generic "Good job!"). Example for a geography quiz:
45
+ \`\`\`json
46
+ { "min": 0, "max": 2, "title": "Lost Tourist", "message": "You might need a map - and a compass." },
47
+ { "min": 3, "max": 5, "title": "Frequent Flyer", "message": "Not bad! You know your way around." },
48
+ { "min": 6, "max": 8, "title": "World Explorer", "message": "Impressive - you really know your stuff." }
49
+ \`\`\`
41
50
  9. **Publish** with clipform_update_form
42
- 10. **Log** with clipform_log_generation (sources, images, attributions)
51
+ 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
52
+ 11. **Log** with clipform_log_generation (sources, images, attributions)
43
53
 
44
54
  ## Before building, ask
45
55
 
@@ -82,26 +92,34 @@ There are NO correct answers. Each option maps to one or more outcome categories
82
92
  3. **Create the form** with clipform_create_form:
83
93
  - show_step_counter: true
84
94
  - disable_back_navigation: true
85
- 4. **Add questions** with clipform_add_question (type: "choice"):
95
+ 4. **Add questions** with clipform_add_node (type: "choice"):
86
96
  - config: { choice: { show_answer_feedback: false } } (no right/wrong!)
87
97
  - Do NOT set randomise_options (option order matters for personality quizzes - lead with the most appealing)
88
98
  - Each option gets \`scores: { "CategoryA": 2, "CategoryB": 1 }\` - weight towards relevant categories
89
99
  - Every option should score in at least one category (no dead options)
90
100
  5. **Generate narration** with clipform_generate_tts - conversational, reflective tone. "What does this say about you?" not "Do you know the answer?"
91
101
  6. **Build video** + **attach media** (same as knowledge quiz workflow)
92
- 7. **Update end screen** with scoring_results (NOT score_ranges):
102
+ 7. **Update end screen** with clipform_update_node - EVERY personality quiz must have:
103
+ - show_score: false, icon: "star"
104
+ - show_share_button: true (personality results are inherently shareable - "I got X, what did you get?")
105
+ - cta_type: "restart", cta_text: "Find out again?" or "Take it again?"
106
+ - scoring_results (NOT score_ranges) with a result per category. Write the title as an identity reveal ("You're a Creative!") and the message as a short, flattering description that makes people want to share it. Be specific to the quiz theme, not generic. Example:
93
107
  \`\`\`json
94
108
  {
95
109
  "show_score": false,
96
110
  "icon": "star",
111
+ "show_share_button": true,
112
+ "cta_type": "restart",
113
+ "cta_text": "Retake quiz",
97
114
  "scoring_results": [
98
- { "category": "Creative", "title": "You're a Creative!", "message": "You see the world differently..." },
99
- { "category": "Analytical", "title": "You're an Analyst!", "message": "You love digging into the details..." }
115
+ { "category": "Creative", "title": "You're a Creative!", "message": "You see the world through colour and possibility. Where others see problems, you see raw material." },
116
+ { "category": "Analytical", "title": "You're an Analyst!", "message": "You don't guess - you figure it out. Your superpower is turning chaos into clarity." }
100
117
  ]
101
118
  }
102
119
  \`\`\`
103
120
  8. **Publish** with clipform_update_form
104
- 9. **Log** with clipform_log_generation
121
+ 9. **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
122
+ 10. **Log** with clipform_log_generation
105
123
 
106
124
  ## Before building, ask
107
125
 
@@ -146,6 +164,7 @@ There are NO correct answers. Each option maps to one or more outcome categories
146
164
  7. **Update end screen** - set expectations: "Thanks! We'll be in touch."
147
165
  8. **Optional: add narration** - warm, inviting tone. "We'd love to hear your story..."
148
166
  9. **Publish** with clipform_update_form
167
+ 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
149
168
 
150
169
  ## Before building, ask
151
170
 
@@ -189,6 +208,7 @@ There are NO correct answers. Each option maps to one or more outcome categories
189
208
  6. **Contact** (optional) - only if you need to follow up. Many surveys work better anonymous.
190
209
  7. **Update end screen** - "Thanks for your feedback!"
191
210
  8. **Publish** with clipform_update_form
211
+ 9. **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
192
212
 
193
213
  ## Key rule: 5 questions max. Every extra question costs completions.
194
214
 
@@ -230,10 +250,11 @@ There are NO correct answers. Each option maps to one or more outcome categories
230
250
  - disable_back_navigation: true (prevents answer shopping that breaks scoring)
231
251
  3. **Add hook question** (type: "choice") - "What best describes you?" or "What are you looking for?" This segments the user.
232
252
  4. **Add qualifying questions** (type: "choice") - 2-3 questions that narrow down the need. Assign scores to each option.
233
- 5. **Set branching logic** with clipform_set_question_logic - route based on answers
253
+ 5. **Set branching logic** with clipform_set_logic - route based on answers
234
254
  6. **Add contact capture** (type: "contact") - name, email, phone. Place AFTER qualifying questions.
235
255
  7. **Update end screen** with score_ranges for personalised outcomes: "Based on your answers, we recommend..."
236
256
  8. **Publish** with clipform_update_form
257
+ 9. **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
237
258
 
238
259
  ## Key rule: 3-5 questions max. Every extra step loses leads.
239
260
 
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
package/dist/resources.js CHANGED
@@ -25,7 +25,7 @@ const MEDIA_WORKFLOW = `## Media Workflow
25
25
  1. **clipform_generate_tts** - narration audio (returns word-level captions)
26
26
  2. **clipform_search_media** (kind: "image") - find 3 images per question
27
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)
28
+ 4. **clipform_upload_node_media** - attach video with captions (set show_captions: true)
29
29
 
30
30
  **Image selection:**
31
31
  - ONLY use URLs from clipform_search_media results
@@ -287,7 +287,7 @@ Route people to the right outcome based on their answers. Lead qualification sco
287
287
 
288
288
  ## Branching Logic
289
289
 
290
- Use clipform_set_question_logic to route based on answers:
290
+ Use clipform_set_logic to route based on answers:
291
291
 
292
292
  - **Segment early.** Q1 answer determines which Q2 they see.
293
293
  - **Converge at capture.** All branches should reach the contact collection step.
@@ -317,7 +317,7 @@ ${WRITING_PRINCIPLES}`,
317
317
  ],
318
318
  }));
319
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.",
320
+ description: "Current session info: auth mode, workspace, plan tier, node limits, feature flags. Read this before planning content to know your constraints.",
321
321
  mimeType: "text/markdown",
322
322
  annotations: { audience: ["assistant"], priority: 1.0 },
323
323
  }, async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -4,16 +4,16 @@ import { registerCreateFormTool } from "./tools/create-form.js";
4
4
  import { registerGetFormTool } from "./tools/get-form.js";
5
5
  import { registerUpdateFormTool } from "./tools/update-form.js";
6
6
  import { registerDeleteFormTool } from "./tools/delete-form.js";
7
- // Question CRUD tools
8
- import { registerAddQuestionTool } from "./tools/add-question.js";
9
- import { registerUpdateQuestionTool } from "./tools/update-question.js";
10
- import { registerDeleteQuestionTool } from "./tools/delete-question.js";
11
- // Media management tools
12
- import { registerUploadQuestionMediaTool } from "./tools/upload-question-media.js";
13
- import { registerGetQuestionMediaTool } from "./tools/get-question-media.js";
14
- import { registerDeleteQuestionMediaTool } from "./tools/delete-question-media.js";
15
- import { registerSetQuestionLogicTool } from "./tools/set-question-logic.js";
16
- import { registerAttachQuestionAudioTool } from "./tools/attach-question-audio.js";
7
+ // Node CRUD tools
8
+ import { registerAddNodeTool } from "./tools/add-node.js";
9
+ import { registerUpdateNodeTool } from "./tools/update-node.js";
10
+ import { registerDeleteNodeTool } from "./tools/delete-node.js";
11
+ // Node media & logic tools
12
+ import { registerUploadNodeMediaTool } from "./tools/upload-node-media.js";
13
+ import { registerGetNodeMediaTool } from "./tools/get-node-media.js";
14
+ import { registerDeleteNodeMediaTool } from "./tools/delete-node-media.js";
15
+ import { registerSetNodeLogicTool } from "./tools/set-node-logic.js";
16
+ import { registerAttachNodeAudioTool } from "./tools/attach-node-audio.js";
17
17
  // Audit logging
18
18
  import { registerLogGenerationTool } from "./tools/log-generation.js";
19
19
  // Content research tools
@@ -27,29 +27,30 @@ 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
29
  import { registerGenerateVideoTool } from "./tools/generate-video.js";
30
+ import { registerCheckRenderTool } from "./tools/check-render.js";
30
31
  // Prompts & Resources
31
32
  import { registerPrompts } from "./prompts.js";
32
33
  import { registerResources } from "./resources.js";
33
34
  export function createServer() {
34
35
  const server = new McpServer({
35
36
  name: "clipform-mcp-server",
36
- version: "1.5.1",
37
+ version: "1.8.0",
37
38
  });
38
39
  // Form CRUD
39
40
  registerCreateFormTool(server);
40
41
  registerGetFormTool(server);
41
42
  registerUpdateFormTool(server);
42
43
  registerDeleteFormTool(server);
43
- // Question CRUD
44
- registerAddQuestionTool(server);
45
- registerUpdateQuestionTool(server);
46
- registerDeleteQuestionTool(server);
47
- // Media management
48
- registerUploadQuestionMediaTool(server);
49
- registerGetQuestionMediaTool(server);
50
- registerDeleteQuestionMediaTool(server);
51
- registerSetQuestionLogicTool(server);
52
- registerAttachQuestionAudioTool(server);
44
+ // Node CRUD
45
+ registerAddNodeTool(server);
46
+ registerUpdateNodeTool(server);
47
+ registerDeleteNodeTool(server);
48
+ // Node media & logic
49
+ registerUploadNodeMediaTool(server);
50
+ registerGetNodeMediaTool(server);
51
+ registerDeleteNodeMediaTool(server);
52
+ registerSetNodeLogicTool(server);
53
+ registerAttachNodeAudioTool(server);
53
54
  // Audit logging
54
55
  registerLogGenerationTool(server);
55
56
  // Content research
@@ -63,6 +64,7 @@ export function createServer() {
63
64
  registerSearchMusicTool(server);
64
65
  registerListCompositionsTool(server);
65
66
  registerListAssetsTool(server);
67
+ registerCheckRenderTool(server);
66
68
  // Prompts & Resources
67
69
  registerPrompts(server);
68
70
  registerResources(server);
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,kBAAkB;AAClB,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,sBAAsB;AACtB,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAExE,yBAAyB;AACzB,OAAO,EAAE,+BAA+B,EAAE,MAAM,kCAAkC,CAAC;AACnF,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,+BAA+B,EAAE,MAAM,kCAAkC,CAAC;AACnF,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,+BAA+B,EAAE,MAAM,kCAAkC,CAAC;AAEnF,gBAAgB;AAChB,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,yBAAyB;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,iBAAiB;AACjB,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,YAAY;IACZ,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE/B,gBAAgB;IAChB,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAEnC,mBAAmB;IACnB,+BAA+B,CAAC,MAAM,CAAC,CAAC;IACxC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,+BAA+B,CAAC,MAAM,CAAC,CAAC;IACxC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,+BAA+B,CAAC,MAAM,CAAC,CAAC;IAExC,gBAAgB;IAChB,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAElC,mBAAmB;IACnB,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE/B,iBAAiB;IACjB,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE/B,sBAAsB;IACtB,eAAe,CAAC,MAAM,CAAC,CAAC;IACxB,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1B,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerAddNodeTool(server: McpServer): void;
@@ -0,0 +1,50 @@
1
+ import { z } from "zod";
2
+ import { NodeSchema, NODE_TYPES_DESCRIPTION } from "../lib/schemas.js";
3
+ import { callApi, errorResult, textResult } from "../lib/api-client.js";
4
+ import { fetchAndFormatFormState } from "../lib/format-form.js";
5
+ export function registerAddNodeTool(server) {
6
+ server.registerTool("clipform_add_node", {
7
+ title: "Add Node",
8
+ description: `Add a new node to an existing form. By default, the node is inserted before the end screen (appended to the end of the flow). Use after_node_id to insert at a specific position.
9
+
10
+ ${NODE_TYPES_DESCRIPTION}
11
+
12
+ All type definitions and config schemas are derived from @vid-master/config (answer-types).`,
13
+ inputSchema: {
14
+ form_id: z.string().uuid().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
15
+ 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."),
16
+ question: NodeSchema.describe("The node to add"),
17
+ after_node_id: z
18
+ .string()
19
+ .optional()
20
+ .describe("Insert after this node ID. Omit to append before the end screen."),
21
+ },
22
+ annotations: {
23
+ readOnlyHint: false,
24
+ destructiveHint: false,
25
+ idempotentHint: false,
26
+ openWorldHint: true,
27
+ },
28
+ }, async ({ form_id, edit_token, question, after_node_id }) => {
29
+ const body = { question };
30
+ if (after_node_id)
31
+ body.after_node_id = after_node_id;
32
+ const result = await callApi(`/forms/${form_id}/nodes`, {
33
+ method: "POST",
34
+ body,
35
+ token: edit_token,
36
+ });
37
+ if (!result.ok) {
38
+ return errorResult(result.error);
39
+ }
40
+ const confirmMsg = [
41
+ `Node added successfully!`,
42
+ `Node ID: ${result.data.node_id}`,
43
+ `Type: ${question.type}`,
44
+ `Prompt: ${question.prompt}`,
45
+ ].join("\n");
46
+ const formState = await fetchAndFormatFormState(form_id, edit_token);
47
+ return textResult(formState ? `${confirmMsg}\n\n---\n\n${formState}` : confirmMsg);
48
+ });
49
+ }
50
+ //# sourceMappingURL=add-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-node.js","sourceRoot":"","sources":["../../src/tools/add-node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE;;EAEjB,sBAAsB;;4FAEoE;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,UAAU,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAChD,aAAa,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,kEAAkE,CACnE;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,aAAa,EAAE,EAAE,EAAE;QACzD,MAAM,IAAI,GAA4B,EAAE,QAAQ,EAAE,CAAC;QACnD,IAAI,aAAa;YAAE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,OAAO,QAAQ,EAAE;YACtD,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,MAAM,UAAU,GAAG;YACjB,0BAA0B;YAC1B,YAAY,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE;YACjC,SAAS,QAAQ,CAAC,IAAI,EAAE;YACxB,WAAW,QAAQ,CAAC,MAAM,EAAE;SAC7B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACrE,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,cAAc,SAAS,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACrF,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerAttachNodeAudioTool(server: McpServer): void;
@@ -1,15 +1,15 @@
1
1
  import { z } from "zod";
2
2
  import { callApi, errorResult, textResult } from "../lib/api-client.js";
3
- export function registerAttachQuestionAudioTool(server) {
3
+ export function registerAttachNodeAudioTool(server) {
4
4
  server.registerTool("clipform_attach_audio", {
5
- title: "Attach Audio to Question",
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).`,
5
+ title: "Attach Audio to Node",
6
+ description: `Attach a sound effect or audio file to a node with existing media (stills only). The audio auto-plays once when a respondent reaches this node. Provide a public URL to the audio file (WAV, MP3, or OGG). The node must already have media uploaded (use clipform_upload_node_media first).`,
7
7
  inputSchema: {
8
8
  form_id: z.string().uuid().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
9
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
- question_id: z
10
+ node_id: z
11
11
  .string()
12
- .describe("The question ID (must already have media attached)"),
12
+ .describe("The node ID (must already have media attached)"),
13
13
  url: z
14
14
  .string()
15
15
  .url()
@@ -21,8 +21,8 @@ export function registerAttachQuestionAudioTool(server) {
21
21
  idempotentHint: true,
22
22
  openWorldHint: true,
23
23
  },
24
- }, async ({ form_id, edit_token, question_id, url }) => {
25
- const result = await callApi(`/forms/${form_id}/questions/${question_id}/audio`, {
24
+ }, async ({ form_id, edit_token, node_id, url }) => {
25
+ const result = await callApi(`/forms/${form_id}/nodes/${node_id}/audio`, {
26
26
  method: "PUT",
27
27
  token: edit_token,
28
28
  body: { url },
@@ -30,8 +30,8 @@ export function registerAttachQuestionAudioTool(server) {
30
30
  if (!result.ok) {
31
31
  return errorResult(result.error);
32
32
  }
33
- return textResult(`Audio attached to question ${question_id}.\n` +
33
+ return textResult(`Audio attached to node ${node_id}.\n` +
34
34
  `Audio path: ${result.data.audio_storage_path}`);
35
35
  });
36
36
  }
37
- //# sourceMappingURL=attach-question-audio.js.map
37
+ //# sourceMappingURL=attach-node-audio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach-node-audio.js","sourceRoot":"","sources":["../../src/tools/attach-node-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,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,8RAA8R;QAC3S,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,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,CAAC,gDAAgD,CAAC;YAC7D,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,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE;QAC9C,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,UAAU,OAAO,QAAQ,EAC1C;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,0BAA0B,OAAO,KAAK;YACpC,eAAe,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAClD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,2 +1,2 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerAddQuestionTool(server: McpServer): void;
2
+ export declare function registerCheckRenderTool(server: McpServer): void;
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+ import { errorResult, textResult } from "../lib/api-client.js";
3
+ import { getJob, pruneJobs } from "../lib/render-jobs.js";
4
+ export function registerCheckRenderTool(server) {
5
+ server.registerTool("clipform_check_render", {
6
+ title: "Check Render Status",
7
+ description: `Check the status of a render job started by clipform_generate_video, clipform_generate_slideshow, or clipform_render_composition.
8
+
9
+ Returns the current status and, when complete, the output URL. If still rendering, wait ~30 seconds before checking again.`,
10
+ inputSchema: {
11
+ job_id: z.string().uuid().describe("The job ID returned by the render tool"),
12
+ },
13
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
14
+ }, async ({ job_id }) => {
15
+ pruneJobs();
16
+ const job = getJob(job_id);
17
+ if (!job) {
18
+ return errorResult(`No render job found with ID ${job_id}. Jobs expire after 30 minutes.`);
19
+ }
20
+ if (job.status === "rendering") {
21
+ const elapsed = Math.round((Date.now() - job.createdAt) / 1000);
22
+ return textResult([
23
+ `Status: rendering (${elapsed}s elapsed)`,
24
+ `Tool: ${job.tool}`,
25
+ ``,
26
+ `Still in progress. Check again in ~30 seconds.`,
27
+ ].join("\n"));
28
+ }
29
+ if (job.status === "failed") {
30
+ return errorResult(`Render failed: ${job.error}`);
31
+ }
32
+ const data = job.result;
33
+ return textResult([
34
+ `Status: complete`,
35
+ `Tool: ${job.tool}`,
36
+ ``,
37
+ ...(data.public_url ? [`Public URL: ${data.public_url}`] : []),
38
+ ...(data.storage_path ? [`Storage path: ${data.storage_path}`] : []),
39
+ ...(data.duration_seconds ? [`Duration: ${data.duration_seconds}s`] : []),
40
+ ...(data.outputPath ? [`Output: ${data.outputPath}`] : []),
41
+ ...(data.format ? [`Format: ${data.format}`] : []),
42
+ ``,
43
+ `Use clipform_upload_node_media with the public URL to attach this video to a node.`,
44
+ ].join("\n"));
45
+ });
46
+ }
47
+ //# sourceMappingURL=check-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-render.js","sourceRoot":"","sources":["../../src/tools/check-render.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE;;2HAEwG;QACrH,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;SAC7E;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KACxG,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,SAAS,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,WAAW,CAAC,+BAA+B,MAAM,iCAAiC,CAAC,CAAC;QAC7F,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;YAChE,OAAO,UAAU,CACf;gBACE,sBAAsB,OAAO,YAAY;gBACzC,SAAS,GAAG,CAAC,IAAI,EAAE;gBACnB,EAAE;gBACF,gDAAgD;aACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,WAAW,CAAC,kBAAkB,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,CAAC,MAAa,CAAC;QAC/B,OAAO,UAAU,CACf;YACE,kBAAkB;YAClB,SAAS,GAAG,CAAC,IAAI,EAAE;YACnB,EAAE;YACF,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,EAAE;YACF,oFAAoF;SACrF,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,13 +1,13 @@
1
1
  import { z } from "zod";
2
2
  import { BUSINESS } from "@vid-master/config";
3
- import { QuestionSchema, QUESTION_TYPES_DESCRIPTION, } from "../lib/schemas.js";
3
+ import { NodeSchema, NODE_TYPES_DESCRIPTION, } from "../lib/schemas.js";
4
4
  import { callApi, errorResult, textResult } from "../lib/api-client.js";
5
5
  export function registerCreateFormTool(server) {
6
6
  server.registerTool("clipform_create_form", {
7
7
  title: "Create Clipform",
8
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.
9
9
 
10
- ${QUESTION_TYPES_DESCRIPTION}
10
+ ${NODE_TYPES_DESCRIPTION}
11
11
 
12
12
  All type definitions and config schemas are derived from @vid-master/config (answer-types). Refer to the config descriptions above for the correct keys and shapes.
13
13
 
@@ -23,7 +23,7 @@ Example: A form that asks a question, collects contact info, then finishes:
23
23
  inputSchema: {
24
24
  title: z.string().describe("Form title"),
25
25
  questions: z
26
- .array(QuestionSchema)
26
+ .array(NodeSchema)
27
27
  .min(1)
28
28
  .describe("Ordered list of questions/steps"),
29
29
  show_step_counter: z
@@ -50,6 +50,10 @@ Example: A form that asks a question, collects contact info, then finishes:
50
50
  .boolean()
51
51
  .optional()
52
52
  .describe("Auto-play video when embedded (default: false). When off, embeds show a thumbnail + play button."),
53
+ tags: z
54
+ .array(z.string())
55
+ .optional()
56
+ .describe("Tags for indexing (e.g. ['quiz', 'trivia', 'arsenal']). Include format, genre, and topics."),
53
57
  },
54
58
  annotations: {
55
59
  readOnlyHint: false,
@@ -57,7 +61,7 @@ Example: A form that asks a question, collects contact info, then finishes:
57
61
  idempotentHint: false,
58
62
  openWorldHint: true,
59
63
  },
60
- }, async ({ title, questions, show_step_counter, disable_back_navigation, primary_color, background_color, font_family, embed_autoplay }) => {
64
+ }, async ({ title, questions, show_step_counter, disable_back_navigation, primary_color, background_color, font_family, embed_autoplay, tags }) => {
61
65
  // 0. Pre-flight: resolve the caller's plan and reject up-front if the
62
66
  // requested question count exceeds it. Without this we'd build a
63
67
  // scaffold + N-1 questions, then 403 on the Nth, leaving an orphan.
@@ -66,29 +70,35 @@ Example: A form that asks a question, collects contact info, then finishes:
66
70
  // thin and never duplicates limit numbers.
67
71
  let planContext = null;
68
72
  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
- }
73
+ if (!meResult.ok) {
74
+ return errorResult(`Unable to determine workspace: ${meResult.error}`);
75
+ }
76
+ const me = meResult.data;
77
+ const workspaceId = me.workspace?.id ?? null;
78
+ if (!workspaceId) {
79
+ return errorResult("No workspace available. Connect your Clipform account in claude.ai → Settings → Connectors, or ensure MCP_WORKSPACE_ID is configured for anonymous mode.");
80
+ }
81
+ planContext = {
82
+ auth_mode: me.auth_mode,
83
+ workspace_id: workspaceId,
84
+ workspace_name: me.workspace?.name ?? null,
85
+ plan_name: me.plan?.name ?? "Free",
86
+ node_limit: me.plan?.node_limit ?? null,
87
+ };
88
+ // questions includes any end_screen the user supplied; the scaffold
89
+ // already has one so we count "real" content nodes only.
90
+ const contentCount = questions.filter((q) => q.type !== "end_screen").length;
91
+ if (planContext.node_limit !== null && contentCount > planContext.node_limit) {
92
+ const upgradeUrl = `${BUSINESS.urls.dashboard}/billing`;
93
+ const message = planContext.auth_mode === "oauth"
94
+ ? `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}.`
95
+ : `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.`;
96
+ return errorResult(message);
87
97
  }
88
98
  // 1. Create bare scaffold
89
99
  const createResult = await callApi("/forms", {
90
100
  method: "POST",
91
- body: { title },
101
+ body: { title, workspace_id: workspaceId },
92
102
  });
93
103
  if (!createResult.ok) {
94
104
  return errorResult(createResult.error);
@@ -134,7 +144,7 @@ Example: A form that asks a question, collects contact info, then finishes:
134
144
  const questions_list = getResult.data.questions;
135
145
  const endScreen = questions_list?.find((qq) => qq.type === "end_screen");
136
146
  if (endScreen) {
137
- await callApi(`/forms/${formId}/questions/${endScreen.id}`, {
147
+ await callApi(`/forms/${formId}/nodes/${endScreen.id}`, {
138
148
  method: "PATCH",
139
149
  body: { prompt: q.prompt, ...(q.config ? { config: q.config } : {}) },
140
150
  token: editToken,
@@ -144,7 +154,7 @@ Example: A form that asks a question, collects contact info, then finishes:
144
154
  }
145
155
  // Fallback: add it normally if we couldn't find the default
146
156
  }
147
- const addResult = await callApi(`/forms/${formId}/questions`, {
157
+ const addResult = await callApi(`/forms/${formId}/nodes`, {
148
158
  method: "POST",
149
159
  body: { question: q },
150
160
  token: editToken,
@@ -159,6 +169,14 @@ Example: A form that asks a question, collects contact info, then finishes:
159
169
  body: { is_published: true },
160
170
  token: editToken,
161
171
  });
172
+ // 5. Tag the form (best-effort)
173
+ if (tags && tags.length > 0) {
174
+ await callApi(`/forms/${formId}/tags`, {
175
+ method: "PUT",
176
+ body: { tags },
177
+ token: editToken,
178
+ });
179
+ }
162
180
  const lines = [
163
181
  `Form created successfully!`,
164
182
  ``,
@@ -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":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerDeleteNodeMediaTool(server: McpServer): void;