@clipform/mcp-server 1.1.0 → 1.3.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 +115 -87
- package/dist/__tests__/api-parity.test.d.ts +1 -0
- package/dist/__tests__/api-parity.test.js +148 -0
- package/dist/__tests__/api-parity.test.js.map +1 -0
- package/dist/lib/api-client.js +4 -3
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/config.js +31 -21
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/schemas.d.ts +28 -2
- package/dist/lib/schemas.js +9 -5
- package/dist/lib/schemas.js.map +1 -1
- package/dist/prompts.js +17 -5
- package/dist/prompts.js.map +1 -1
- package/dist/server.js +5 -21
- package/dist/server.js.map +1 -1
- package/dist/tools/add-question.js +4 -4
- package/dist/tools/create-form.js +64 -20
- package/dist/tools/create-form.js.map +1 -1
- package/dist/tools/generate-slideshow.js +1 -1
- package/dist/tools/generate-tts.js +2 -2
- package/dist/tools/generate-tts.js.map +1 -1
- package/dist/tools/search-media.d.ts +2 -0
- package/dist/tools/search-media.js +40 -0
- package/dist/tools/search-media.js.map +1 -0
- package/dist/tools/search-news.js +13 -4
- package/dist/tools/search-news.js.map +1 -1
- package/dist/tools/update-form.js +59 -2
- package/dist/tools/update-form.js.map +1 -1
- package/dist/tools/update-question.js +8 -3
- package/dist/tools/update-question.js.map +1 -1
- package/dist/tools/upload-question-media.js +36 -8
- package/dist/tools/upload-question-media.js.map +1 -1
- package/package.json +35 -40
- package/dist/tools/get-daily-content.d.ts +0 -2
- package/dist/tools/get-daily-content.js +0 -66
- package/dist/tools/get-daily-content.js.map +0 -1
- package/dist/tools/get-trivia.d.ts +0 -2
- package/dist/tools/get-trivia.js +0 -49
- package/dist/tools/get-trivia.js.map +0 -1
- package/dist/tools/lookup-country.d.ts +0 -2
- package/dist/tools/lookup-country.js +0 -38
- package/dist/tools/lookup-country.js.map +0 -1
- package/dist/tools/search-images.d.ts +0 -2
- package/dist/tools/search-images.js +0 -36
- package/dist/tools/search-images.js.map +0 -1
- package/dist/tools/search-knowledge.d.ts +0 -2
- package/dist/tools/search-knowledge.js +0 -40
- package/dist/tools/search-knowledge.js.map +0 -1
- package/dist/tools/search-videos.d.ts +0 -2
- package/dist/tools/search-videos.js +0 -37
- package/dist/tools/search-videos.js.map +0 -1
package/dist/prompts.js
CHANGED
|
@@ -14,9 +14,10 @@ export function registerPrompts(server) {
|
|
|
14
14
|
type: "text",
|
|
15
15
|
text: `When creating a quiz (knowledge questions with correct/wrong answers):
|
|
16
16
|
|
|
17
|
-
**Form settings** (set
|
|
17
|
+
**Form settings** (set during clipform_create_form):
|
|
18
18
|
- show_step_counter: true (shows "1/5" progress)
|
|
19
19
|
- disable_back_navigation: true (no going back to change answers)
|
|
20
|
+
- Always set both of these when creating a quiz
|
|
20
21
|
|
|
21
22
|
**Question defaults:**
|
|
22
23
|
- Randomise answer options (set randomise_options: true in config)
|
|
@@ -26,15 +27,26 @@ export function registerPrompts(server) {
|
|
|
26
27
|
**Scoring:**
|
|
27
28
|
- Set score: 1 on the correct answer option, score: 0 on wrong answers
|
|
28
29
|
- This enables automatic score tracking throughout the quiz
|
|
30
|
+
- On the end_screen, set show_score: true and icon: "trophy" in config to display the score and a trophy icon
|
|
29
31
|
|
|
30
32
|
**Media workflow (if the user wants video):**
|
|
31
|
-
1. clipform_generate_tts - generate narration audio for each question
|
|
32
|
-
2.
|
|
33
|
+
1. clipform_generate_tts - generate narration audio for each question (returns captions)
|
|
34
|
+
2. clipform_search_media (kind: "image") - find 3 images per question
|
|
33
35
|
3. clipform_generate_slideshow - create Ken Burns video from images + audio
|
|
34
|
-
4.
|
|
36
|
+
4. clipform_upload_question_media - attach video to question. ALWAYS include the captions from step 1 and set show_captions: true. Captions must always be on for narrated content.
|
|
35
37
|
|
|
36
38
|
**Image selection:**
|
|
37
|
-
- ONLY use image URLs from
|
|
39
|
+
- ONLY use image URLs from clipform_search_media results. These are quality-filtered and high-res.
|
|
40
|
+
|
|
41
|
+
**Writing the questions - factual accuracy (IMPORTANT):**
|
|
42
|
+
For timeless topics (history, geography, science, nature, general knowledge up to your training cutoff), write questions directly from your own knowledge - a good language model is more accurate and more interesting than a generic trivia API.
|
|
43
|
+
|
|
44
|
+
For any topic that is recent (post-training-cutoff) or any fact you are NOT confident about, follow this preference order BEFORE writing the question:
|
|
45
|
+
1. If your client exposes a native web search or web fetch tool (e.g. WebSearch / WebFetch), use that - it is broader and more current.
|
|
46
|
+
2. Otherwise, use clipform_search_news for structured current-news results.
|
|
47
|
+
3. If neither is available, REFUSE rather than fabricate. Tell the user you cannot verify facts about that topic and suggest they provide the source material.
|
|
48
|
+
|
|
49
|
+
Never invent dates, names, statistics, or event details you are not sure of. It is always better to refuse a question than to ship a hallucinated one.
|
|
38
50
|
|
|
39
51
|
**Narration style:**
|
|
40
52
|
- The TTS narration should only read the question - do NOT repeat the answer options verbally. The options are displayed on screen for the user to read and tap.
|
package/dist/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,cAAc,CACnB,aAAa,EACb;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,+DAA+D;KAC7E,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,6BAA6B,EAAE;aACxE;YACD;gBACE,IAAI,EAAE,WAAoB;gBAC1B,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,cAAc,CACnB,aAAa,EACb;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,+DAA+D;KAC7E,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,6BAA6B,EAAE;aACxE;YACD;gBACE,IAAI,EAAE,WAAoB;gBAC1B,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCAiDiB;iBACxB;aACF;SACF;KACF,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,cAAc,CACnB,aAAa,EACb;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,qEAAqE;KACnF,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,6BAA6B,EAAE;aACxE;YACD;gBACE,IAAI,EAAE,WAAoB;gBAC1B,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;;;;;;;;;;;;iIAY+G;iBACtH;aACF;SACF;KACF,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,cAAc,CACnB,uBAAuB,EACvB;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,mEAAmE;KACjF,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gDAAgD,EAAE;aAC3F;YACD;gBACE,IAAI,EAAE,WAAoB;gBAC1B,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;;;;;;;;;;;;;;;;;+DAiB6C;iBACpD;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -14,24 +14,16 @@ import { registerGetQuestionMediaTool } from "./tools/get-question-media.js";
|
|
|
14
14
|
import { registerDeleteQuestionMediaTool } from "./tools/delete-question-media.js";
|
|
15
15
|
import { registerSetQuestionLogicTool } from "./tools/set-question-logic.js";
|
|
16
16
|
import { registerAttachQuestionAudioTool } from "./tools/attach-question-audio.js";
|
|
17
|
-
//
|
|
18
|
-
import { registerGenerateTtsTool } from "./tools/generate-tts.js";
|
|
19
|
-
import { registerGenerateSlideshowTool } from "./tools/generate-slideshow.js";
|
|
17
|
+
// Audit logging
|
|
20
18
|
import { registerLogGenerationTool } from "./tools/log-generation.js";
|
|
21
|
-
//
|
|
22
|
-
import { registerSearchImagesTool } from "./tools/search-images.js";
|
|
23
|
-
import { registerSearchVideosTool } from "./tools/search-videos.js";
|
|
24
|
-
import { registerSearchKnowledgeTool } from "./tools/search-knowledge.js";
|
|
19
|
+
// Content research tools
|
|
25
20
|
import { registerSearchNewsTool } from "./tools/search-news.js";
|
|
26
|
-
import { registerGetTriviaTool } from "./tools/get-trivia.js";
|
|
27
|
-
import { registerLookupCountryTool } from "./tools/lookup-country.js";
|
|
28
|
-
import { registerGetDailyContentTool } from "./tools/get-daily-content.js";
|
|
29
21
|
// Prompts
|
|
30
22
|
import { registerPrompts } from "./prompts.js";
|
|
31
23
|
export function createServer() {
|
|
32
24
|
const server = new McpServer({
|
|
33
25
|
name: "clipform-mcp-server",
|
|
34
|
-
version: "1.
|
|
26
|
+
version: "1.3.0",
|
|
35
27
|
});
|
|
36
28
|
// Form CRUD
|
|
37
29
|
registerCreateFormTool(server);
|
|
@@ -48,18 +40,10 @@ export function createServer() {
|
|
|
48
40
|
registerDeleteQuestionMediaTool(server);
|
|
49
41
|
registerSetQuestionLogicTool(server);
|
|
50
42
|
registerAttachQuestionAudioTool(server);
|
|
51
|
-
//
|
|
52
|
-
registerGenerateTtsTool(server);
|
|
53
|
-
registerGenerateSlideshowTool(server);
|
|
43
|
+
// Audit logging
|
|
54
44
|
registerLogGenerationTool(server);
|
|
55
|
-
//
|
|
56
|
-
registerSearchImagesTool(server);
|
|
57
|
-
registerSearchVideosTool(server);
|
|
58
|
-
registerSearchKnowledgeTool(server);
|
|
45
|
+
// Content research
|
|
59
46
|
registerSearchNewsTool(server);
|
|
60
|
-
registerGetTriviaTool(server);
|
|
61
|
-
registerLookupCountryTool(server);
|
|
62
|
-
registerGetDailyContentTool(server);
|
|
63
47
|
// Prompts
|
|
64
48
|
registerPrompts(server);
|
|
65
49
|
return server;
|
package/dist/server.js.map
CHANGED
|
@@ -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,
|
|
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,UAAU;AACV,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,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,UAAU;IACV,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -4,10 +4,10 @@ import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
|
4
4
|
export function registerAddQuestionTool(server) {
|
|
5
5
|
server.registerTool("clipform_add_question", {
|
|
6
6
|
title: "Add Question",
|
|
7
|
-
description: `Add a new question to an existing form. By default, the question is inserted before the end screen (appended to the end of the flow). Use after_question_id to insert at a specific position.
|
|
8
|
-
|
|
9
|
-
${QUESTION_TYPES_DESCRIPTION}
|
|
10
|
-
|
|
7
|
+
description: `Add a new question to an existing form. By default, the question is inserted before the end screen (appended to the end of the flow). Use after_question_id to insert at a specific position.
|
|
8
|
+
|
|
9
|
+
${QUESTION_TYPES_DESCRIPTION}
|
|
10
|
+
|
|
11
11
|
All type definitions and config schemas are derived from @vid-master/config (answer-types).`,
|
|
12
12
|
inputSchema: {
|
|
13
13
|
form_id: z.string().describe("The form ID"),
|
|
@@ -4,20 +4,20 @@ import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
|
4
4
|
export function registerCreateFormTool(server) {
|
|
5
5
|
server.registerTool("clipform_create_form", {
|
|
6
6
|
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
|
-
|
|
9
|
-
${QUESTION_TYPES_DESCRIPTION}
|
|
10
|
-
|
|
11
|
-
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.
|
|
12
|
-
|
|
13
|
-
Example: A form that asks a question, collects contact info, then finishes:
|
|
14
|
-
{
|
|
15
|
-
title: "Quick Survey",
|
|
16
|
-
questions: [
|
|
17
|
-
{ type: "open", prompt: "What's your biggest challenge?" },
|
|
18
|
-
{ type: "contact", prompt: "Leave your details", config: { fields: [{ id: "first_name", required: true }, { id: "email", required: true }] } },
|
|
19
|
-
{ type: "end_screen", prompt: "Thanks for your response!" }
|
|
20
|
-
]
|
|
7
|
+
description: `Create a new Clipform (interactive video-style form). Returns a claim URL and an edit_token for further modifications.
|
|
8
|
+
|
|
9
|
+
${QUESTION_TYPES_DESCRIPTION}
|
|
10
|
+
|
|
11
|
+
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.
|
|
12
|
+
|
|
13
|
+
Example: A form that asks a question, collects contact info, then finishes:
|
|
14
|
+
{
|
|
15
|
+
title: "Quick Survey",
|
|
16
|
+
questions: [
|
|
17
|
+
{ type: "open", prompt: "What's your biggest challenge?" },
|
|
18
|
+
{ type: "contact", prompt: "Leave your details", config: { fields: [{ id: "first_name", required: true }, { id: "email", required: true }] } },
|
|
19
|
+
{ type: "end_screen", prompt: "Thanks for your response!" }
|
|
20
|
+
]
|
|
21
21
|
}`,
|
|
22
22
|
inputSchema: {
|
|
23
23
|
title: z.string().describe("Form title"),
|
|
@@ -25,6 +25,30 @@ Example: A form that asks a question, collects contact info, then finishes:
|
|
|
25
25
|
.array(QuestionSchema)
|
|
26
26
|
.min(1)
|
|
27
27
|
.describe("Ordered list of questions/steps"),
|
|
28
|
+
show_step_counter: z
|
|
29
|
+
.boolean()
|
|
30
|
+
.optional()
|
|
31
|
+
.describe("Show step counter (e.g. '1/5'). Set true for quizzes."),
|
|
32
|
+
disable_back_navigation: z
|
|
33
|
+
.boolean()
|
|
34
|
+
.optional()
|
|
35
|
+
.describe("Prevent going back. Set true for quizzes."),
|
|
36
|
+
primary_color: z
|
|
37
|
+
.string()
|
|
38
|
+
.optional()
|
|
39
|
+
.describe("Primary/brand color (hex or CSS color). Used for buttons and accents."),
|
|
40
|
+
background_color: z
|
|
41
|
+
.string()
|
|
42
|
+
.optional()
|
|
43
|
+
.describe("Background color (hex, rgba, or CSS color)."),
|
|
44
|
+
font_family: z
|
|
45
|
+
.string()
|
|
46
|
+
.optional()
|
|
47
|
+
.describe("Font family name (e.g. 'Inter', 'Roboto', 'Playfair Display')."),
|
|
48
|
+
embed_autoplay: z
|
|
49
|
+
.boolean()
|
|
50
|
+
.optional()
|
|
51
|
+
.describe("Auto-play video when embedded (default: false). When off, embeds show a thumbnail + play button."),
|
|
28
52
|
},
|
|
29
53
|
annotations: {
|
|
30
54
|
readOnlyHint: false,
|
|
@@ -32,7 +56,7 @@ Example: A form that asks a question, collects contact info, then finishes:
|
|
|
32
56
|
idempotentHint: false,
|
|
33
57
|
openWorldHint: true,
|
|
34
58
|
},
|
|
35
|
-
}, async ({ title, questions }) => {
|
|
59
|
+
}, async ({ title, questions, show_step_counter, disable_back_navigation, primary_color, background_color, font_family, embed_autoplay }) => {
|
|
36
60
|
// 1. Create bare scaffold
|
|
37
61
|
const createResult = await callApi("/forms", {
|
|
38
62
|
method: "POST",
|
|
@@ -44,7 +68,28 @@ Example: A form that asks a question, collects contact info, then finishes:
|
|
|
44
68
|
const { data } = createResult;
|
|
45
69
|
const formId = data.form_id;
|
|
46
70
|
const editToken = data.edit_token;
|
|
47
|
-
// 2.
|
|
71
|
+
// 2. Apply form settings and theme if provided
|
|
72
|
+
const settingsBody = {};
|
|
73
|
+
if (show_step_counter !== undefined)
|
|
74
|
+
settingsBody.show_step_counter = show_step_counter;
|
|
75
|
+
if (disable_back_navigation !== undefined)
|
|
76
|
+
settingsBody.disable_back_navigation = disable_back_navigation;
|
|
77
|
+
if (primary_color !== undefined)
|
|
78
|
+
settingsBody.primary_color = primary_color;
|
|
79
|
+
if (background_color !== undefined)
|
|
80
|
+
settingsBody.background_color = background_color;
|
|
81
|
+
if (font_family !== undefined)
|
|
82
|
+
settingsBody.font_family = font_family;
|
|
83
|
+
if (embed_autoplay !== undefined)
|
|
84
|
+
settingsBody.embed_autoplay = embed_autoplay;
|
|
85
|
+
if (Object.keys(settingsBody).length > 0) {
|
|
86
|
+
await callApi(`/forms/${formId}`, {
|
|
87
|
+
method: "PATCH",
|
|
88
|
+
body: settingsBody,
|
|
89
|
+
token: editToken,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// 3. Add each question via the add-question endpoint
|
|
48
93
|
for (const q of questions) {
|
|
49
94
|
// If it's an end_screen, update the default one instead of adding another
|
|
50
95
|
if (q.type === "end_screen") {
|
|
@@ -76,7 +121,7 @@ Example: A form that asks a question, collects contact info, then finishes:
|
|
|
76
121
|
return errorResult(`Failed to add question "${q.prompt}": ${addResult.error}`);
|
|
77
122
|
}
|
|
78
123
|
}
|
|
79
|
-
//
|
|
124
|
+
// 4. Publish the form
|
|
80
125
|
await callApi(`/forms/${formId}`, {
|
|
81
126
|
method: "PATCH",
|
|
82
127
|
body: { is_published: true },
|
|
@@ -87,11 +132,10 @@ Example: A form that asks a question, collects contact info, then finishes:
|
|
|
87
132
|
``,
|
|
88
133
|
`Title: ${title}`,
|
|
89
134
|
`Questions: ${questions.length}`,
|
|
90
|
-
`Form ID: ${formId}`,
|
|
91
|
-
`Share ID: ${data.share_id}`,
|
|
92
135
|
`Edit Token: ${editToken}`,
|
|
93
136
|
``,
|
|
94
|
-
`
|
|
137
|
+
`Preview the form: ${data.viewer_url}`,
|
|
138
|
+
`Claim the form: ${data.claim_url}`,
|
|
95
139
|
``,
|
|
96
140
|
`IMPORTANT: Save the edit_token above — you need it for all subsequent operations (clipform_get_form, clipform_update_form, clipform_add_question, clipform_update_question, clipform_delete_question, clipform_delete_form).`,
|
|
97
141
|
`The token expires when the user claims the form via the claim URL.`,
|
|
@@ -1 +1 @@
|
|
|
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,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;
|
|
1
|
+
{"version":3,"file":"create-form.js","sourceRoot":"","sources":["../../src/tools/create-form.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ export function registerGenerateSlideshowTool(server) {
|
|
|
6
6
|
description: `Generate a Ken Burns slideshow video from images and audio. Uses FFmpeg to create a video with pan/zoom effects and crossfade transitions. The video is uploaded to storage and a public URL is returned.
|
|
7
7
|
|
|
8
8
|
Workflow:
|
|
9
|
-
1. Find images (use
|
|
9
|
+
1. Find images (use clipform_search_media with kind: "image", or provide URLs)
|
|
10
10
|
2. Provide an audio track URL (e.g. TTS narration from clipform_generate_tts)
|
|
11
11
|
3. This tool creates a video with Ken Burns pan/zoom effects over the images, synced to the audio duration
|
|
12
12
|
4. Attach the resulting public URL to a question using clipform_upload_media with media_type "video"
|
|
@@ -7,7 +7,7 @@ export function registerGenerateTtsTool(server) {
|
|
|
7
7
|
|
|
8
8
|
Use this to create narration for slideshow videos. Workflow:
|
|
9
9
|
1. Generate TTS audio with this tool
|
|
10
|
-
2. Search for images with
|
|
10
|
+
2. Search for images with clipform_search_media (kind: "image")
|
|
11
11
|
3. Create a slideshow with clipform_generate_slideshow (pass the audio URL + image URLs)
|
|
12
12
|
4. Attach the video to a question with clipform_upload_media
|
|
13
13
|
|
|
@@ -41,7 +41,7 @@ Returns the audio public URL and word-level captions for subtitle display.`,
|
|
|
41
41
|
`Captions JSON: ${JSON.stringify(data.captions)}`,
|
|
42
42
|
``,
|
|
43
43
|
`Use the Audio URL with clipform_generate_slideshow to create a video.`,
|
|
44
|
-
`
|
|
44
|
+
`IMPORTANT: When uploading the final video with clipform_upload_question_media, pass the COMPLETE Captions JSON above as the "captions" parameter — including the "words" arrays inside each segment. Do NOT strip or simplify the JSON. The viewer needs word-level timing data to display captions. Captions must always be enabled for narrated content.`,
|
|
45
45
|
].join("\n"));
|
|
46
46
|
});
|
|
47
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-tts.js","sourceRoot":"","sources":["../../src/tools/generate-tts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE;;;;;;;;;;;;;;;2EAewD;QACrE,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;YACrF,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;SAC1H;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE;KACzG,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,gCAAgC,EAAE;YACrE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAW,CAAC;QAChC,OAAO,UAAU,CACf;YACE,mCAAmC;YACnC,EAAE;YACF,UAAU,IAAI,CAAC,KAAK,EAAE;YACtB,cAAc,IAAI,CAAC,QAAQ,EAAE;YAC7B,iBAAiB,IAAI,CAAC,WAAW,EAAE;YACnC,aAAa,IAAI,CAAC,QAAQ,CAAC,MAAM,WAAW;YAC5C,kBAAkB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACjD,EAAE;YACF,uEAAuE;YACvE,
|
|
1
|
+
{"version":3,"file":"generate-tts.js","sourceRoot":"","sources":["../../src/tools/generate-tts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE;;;;;;;;;;;;;;;2EAewD;QACrE,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;YACrF,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;SAC1H;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE;KACzG,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,gCAAgC,EAAE;YACrE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAW,CAAC;QAChC,OAAO,UAAU,CACf;YACE,mCAAmC;YACnC,EAAE;YACF,UAAU,IAAI,CAAC,KAAK,EAAE;YACtB,cAAc,IAAI,CAAC,QAAQ,EAAE;YAC7B,iBAAiB,IAAI,CAAC,WAAW,EAAE;YACnC,aAAa,IAAI,CAAC,QAAQ,CAAC,MAAM,WAAW;YAC5C,kBAAkB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACjD,EAAE;YACF,uEAAuE;YACvE,4VAA4V;SAC7V,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { callInternalApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
+
export function registerSearchMediaTool(server) {
|
|
4
|
+
server.registerTool("clipform_search_media", {
|
|
5
|
+
title: "Search Media",
|
|
6
|
+
description: `Search royalty-free images or stock video clips to attach to a quiz question. Routes across Pexels, Unsplash, Pixabay, Wikimedia, NASA, and iNaturalist for images; Pexels and Pixabay for video. The router picks relevant providers based on the topic (space → NASA, nature → iNaturalist, general → stock libraries). Returns URLs you can pass to clipform_upload_question_media or clipform_generate_slideshow.`,
|
|
7
|
+
inputSchema: {
|
|
8
|
+
query: z.string().describe("What to search for (e.g. 'african lion', 'saturn rings', 'city timelapse')"),
|
|
9
|
+
kind: z.enum(["image", "video"]).describe("image = stock photos, video = stock clips"),
|
|
10
|
+
count: z.number().min(1).max(20).default(6).optional()
|
|
11
|
+
.describe("Max results per provider (default 6 for image, 3 for video)"),
|
|
12
|
+
},
|
|
13
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
14
|
+
}, async ({ query, kind, count }) => {
|
|
15
|
+
const result = await callInternalApi("/internal/formgen/search-media", {
|
|
16
|
+
body: { query, kind, count },
|
|
17
|
+
});
|
|
18
|
+
if (!result.ok)
|
|
19
|
+
return errorResult(result.error);
|
|
20
|
+
const results = result.data.results;
|
|
21
|
+
if (!results.length)
|
|
22
|
+
return textResult(`No ${kind}s found for "${query}".`);
|
|
23
|
+
const lines = [`Found ${results.length} ${kind}s for "${query}":\n`];
|
|
24
|
+
for (const item of results.slice(0, 15)) {
|
|
25
|
+
lines.push(`- [${item.source}] ${item.title}`);
|
|
26
|
+
lines.push(` URL: ${item.url}`);
|
|
27
|
+
if (item.width && item.height)
|
|
28
|
+
lines.push(` Size: ${item.width}x${item.height}`);
|
|
29
|
+
if (kind === "video" && item.duration)
|
|
30
|
+
lines.push(` Duration: ${item.duration}s`);
|
|
31
|
+
if (item.attribution)
|
|
32
|
+
lines.push(` Attribution: ${item.attribution}`);
|
|
33
|
+
if (item.license)
|
|
34
|
+
lines.push(` License: ${item.license}`);
|
|
35
|
+
lines.push("");
|
|
36
|
+
}
|
|
37
|
+
return textResult(lines.join("\n"));
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=search-media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-media.js","sourceRoot":"","sources":["../../src/tools/search-media.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,uZAAuZ;QACpa,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4EAA4E,CAAC;YACxG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;YACtF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBACnD,QAAQ,CAAC,6DAA6D,CAAC;SAC3E;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KACvG,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,gCAAgC,EAAE;YACrE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;SAC7B,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAI,MAAM,CAAC,IAAY,CAAC,OAAgB,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,UAAU,CAAC,MAAM,IAAI,gBAAgB,KAAK,IAAI,CAAC,CAAC;QAE5E,MAAM,KAAK,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,IAAI,IAAI,UAAU,KAAK,MAAM,CAAC,CAAC;QACrE,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACjC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAClF,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YACnF,IAAI,IAAI,CAAC,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACvE,IAAI,IAAI,CAAC,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { callInternalApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
3
|
export function registerSearchNewsTool(server) {
|
|
4
|
-
server.registerTool("
|
|
5
|
-
title: "Search News",
|
|
6
|
-
description: `
|
|
4
|
+
server.registerTool("clipform_search_news", {
|
|
5
|
+
title: "Search News (fallback)",
|
|
6
|
+
description: `FALLBACK news lookup for clients without native web search. Returns structured current-news articles from NewsAPI and The Guardian.
|
|
7
|
+
|
|
8
|
+
WHEN TO USE:
|
|
9
|
+
- The user asks for a quiz about an event, person, or topic that is recent (post-May-2025) or that you are not confident you know accurately.
|
|
10
|
+
- Your client does NOT already expose a native web search / web fetch tool. If it does (e.g. WebSearch in Claude Code, web search in Claude Desktop), prefer that - it is broader and more current than this tool.
|
|
11
|
+
- You would otherwise be at risk of hallucinating facts.
|
|
12
|
+
|
|
13
|
+
DO NOT USE for timeless topics you already know well (history, geography, science, general knowledge) - write those from your own knowledge, it is faster and the result is better.
|
|
14
|
+
|
|
15
|
+
If neither native web search nor this tool is available and the topic is post-cutoff or uncertain, REFUSE rather than fabricate.`,
|
|
7
16
|
inputSchema: {
|
|
8
|
-
query: z.string().describe("News search query (e.g. '
|
|
17
|
+
query: z.string().describe("News search query (e.g. 'Iran war 2026', 'Australian Open final', 'UK election')"),
|
|
9
18
|
count: z.number().min(1).max(15).default(5).optional()
|
|
10
19
|
.describe("Max results per provider (default 5)"),
|
|
11
20
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-news.js","sourceRoot":"","sources":["../../src/tools/search-news.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,
|
|
1
|
+
{"version":3,"file":"search-news.js","sourceRoot":"","sources":["../../src/tools/search-news.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE;;;;;;;;;iIAS8G;QAC3H,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kFAAkF,CAAC;YAC9G,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBACnD,QAAQ,CAAC,sCAAsC,CAAC;SACpD;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KACvG,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QACzB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,+BAA+B,EAAE;YACpE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAI,MAAM,CAAC,IAAY,CAAC,OAAgB,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,UAAU,CAAC,+BAA+B,KAAK,IAAI,CAAC,CAAC;QAEjF,MAAM,KAAK,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,kBAAkB,KAAK,MAAM,CAAC,CAAC;QACrE,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YAChE,IAAI,OAAO,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACpC,IAAI,OAAO,CAAC,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
|
3
3
|
export function registerUpdateFormTool(server) {
|
|
4
4
|
server.registerTool("clipform_update_form", {
|
|
5
5
|
title: "Update Clipform",
|
|
6
|
-
description: `Update a form's title
|
|
6
|
+
description: `Update a form's title, publish status, or settings. Use clipform_get_form first to see current values.`,
|
|
7
7
|
inputSchema: {
|
|
8
8
|
form_id: z.string().describe("The form ID"),
|
|
9
9
|
edit_token: z.string().describe("The edit token"),
|
|
@@ -12,6 +12,35 @@ export function registerUpdateFormTool(server) {
|
|
|
12
12
|
.boolean()
|
|
13
13
|
.optional()
|
|
14
14
|
.describe("Set to true to publish, false to unpublish"),
|
|
15
|
+
show_step_counter: z
|
|
16
|
+
.boolean()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Show step counter (e.g. '1/5'). Recommended for quizzes."),
|
|
19
|
+
disable_back_navigation: z
|
|
20
|
+
.boolean()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Prevent respondents from going back. Recommended for quizzes."),
|
|
23
|
+
total_steps: z
|
|
24
|
+
.number()
|
|
25
|
+
.nullable()
|
|
26
|
+
.optional()
|
|
27
|
+
.describe("Override the total step count shown in the step counter. Set null to auto-calculate."),
|
|
28
|
+
primary_color: z
|
|
29
|
+
.string()
|
|
30
|
+
.optional()
|
|
31
|
+
.describe("Primary/brand color (hex or CSS color). Used for buttons and accents."),
|
|
32
|
+
background_color: z
|
|
33
|
+
.string()
|
|
34
|
+
.optional()
|
|
35
|
+
.describe("Background color (hex, rgba, or CSS color)."),
|
|
36
|
+
font_family: z
|
|
37
|
+
.string()
|
|
38
|
+
.optional()
|
|
39
|
+
.describe("Font family name (e.g. 'Inter', 'Roboto', 'Playfair Display')."),
|
|
40
|
+
embed_autoplay: z
|
|
41
|
+
.boolean()
|
|
42
|
+
.optional()
|
|
43
|
+
.describe("Auto-play video when embedded (default: false). When off, embeds show a thumbnail + play button."),
|
|
15
44
|
},
|
|
16
45
|
annotations: {
|
|
17
46
|
readOnlyHint: false,
|
|
@@ -19,12 +48,26 @@ export function registerUpdateFormTool(server) {
|
|
|
19
48
|
idempotentHint: true,
|
|
20
49
|
openWorldHint: true,
|
|
21
50
|
},
|
|
22
|
-
}, async ({ form_id, edit_token, title, is_published }) => {
|
|
51
|
+
}, async ({ form_id, edit_token, title, is_published, show_step_counter, disable_back_navigation, total_steps, primary_color, background_color, font_family, embed_autoplay }) => {
|
|
23
52
|
const body = {};
|
|
24
53
|
if (title !== undefined)
|
|
25
54
|
body.title = title;
|
|
26
55
|
if (is_published !== undefined)
|
|
27
56
|
body.is_published = is_published;
|
|
57
|
+
if (show_step_counter !== undefined)
|
|
58
|
+
body.show_step_counter = show_step_counter;
|
|
59
|
+
if (disable_back_navigation !== undefined)
|
|
60
|
+
body.disable_back_navigation = disable_back_navigation;
|
|
61
|
+
if (total_steps !== undefined)
|
|
62
|
+
body.total_steps = total_steps;
|
|
63
|
+
if (primary_color !== undefined)
|
|
64
|
+
body.primary_color = primary_color;
|
|
65
|
+
if (background_color !== undefined)
|
|
66
|
+
body.background_color = background_color;
|
|
67
|
+
if (font_family !== undefined)
|
|
68
|
+
body.font_family = font_family;
|
|
69
|
+
if (embed_autoplay !== undefined)
|
|
70
|
+
body.embed_autoplay = embed_autoplay;
|
|
28
71
|
const result = await callApi(`/forms/${form_id}`, {
|
|
29
72
|
method: "PATCH",
|
|
30
73
|
body,
|
|
@@ -38,6 +81,20 @@ export function registerUpdateFormTool(server) {
|
|
|
38
81
|
updates.push(`Title → "${title}"`);
|
|
39
82
|
if (is_published !== undefined)
|
|
40
83
|
updates.push(`Published → ${is_published}`);
|
|
84
|
+
if (show_step_counter !== undefined)
|
|
85
|
+
updates.push(`Step counter → ${show_step_counter}`);
|
|
86
|
+
if (disable_back_navigation !== undefined)
|
|
87
|
+
updates.push(`Back navigation → ${disable_back_navigation ? "disabled" : "enabled"}`);
|
|
88
|
+
if (total_steps !== undefined)
|
|
89
|
+
updates.push(`Total steps → ${total_steps === null ? "auto" : total_steps}`);
|
|
90
|
+
if (primary_color !== undefined)
|
|
91
|
+
updates.push(`Primary color → ${primary_color}`);
|
|
92
|
+
if (background_color !== undefined)
|
|
93
|
+
updates.push(`Background color → ${background_color}`);
|
|
94
|
+
if (font_family !== undefined)
|
|
95
|
+
updates.push(`Font → ${font_family}`);
|
|
96
|
+
if (embed_autoplay !== undefined)
|
|
97
|
+
updates.push(`Embed autoplay → ${embed_autoplay}`);
|
|
41
98
|
return textResult(`Form updated:\n${updates.join("\n")}`);
|
|
42
99
|
});
|
|
43
100
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-form.js","sourceRoot":"","sources":["../../src/tools/update-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,
|
|
1
|
+
{"version":3,"file":"update-form.js","sourceRoot":"","sources":["../../src/tools/update-form.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { QUESTION_TYPES, CONFIG_DESCRIPTION } from "../lib/schemas.js";
|
|
2
|
+
import { QUESTION_TYPES, CONFIG_DESCRIPTION, OptionSchema } from "../lib/schemas.js";
|
|
3
3
|
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
4
4
|
export function registerUpdateQuestionTool(server) {
|
|
5
5
|
server.registerTool("clipform_update_question", {
|
|
@@ -10,6 +10,7 @@ export function registerUpdateQuestionTool(server) {
|
|
|
10
10
|
edit_token: z.string().describe("The edit token"),
|
|
11
11
|
question_id: z.string().describe("The question ID to update"),
|
|
12
12
|
prompt: z.string().optional().describe("New question text"),
|
|
13
|
+
label: z.string().optional().describe("Short label for the question (used in logic builder)"),
|
|
13
14
|
type: z
|
|
14
15
|
.enum(QUESTION_TYPES)
|
|
15
16
|
.optional()
|
|
@@ -20,7 +21,7 @@ export function registerUpdateQuestionTool(server) {
|
|
|
20
21
|
.optional()
|
|
21
22
|
.describe(CONFIG_DESCRIPTION),
|
|
22
23
|
options: z
|
|
23
|
-
.array(
|
|
24
|
+
.array(OptionSchema)
|
|
24
25
|
.optional()
|
|
25
26
|
.describe("Replace all options (for choice questions). Omit to keep existing options."),
|
|
26
27
|
},
|
|
@@ -30,10 +31,12 @@ export function registerUpdateQuestionTool(server) {
|
|
|
30
31
|
idempotentHint: true,
|
|
31
32
|
openWorldHint: true,
|
|
32
33
|
},
|
|
33
|
-
}, async ({ form_id, edit_token, question_id, prompt, type, required, config, options, }) => {
|
|
34
|
+
}, async ({ form_id, edit_token, question_id, prompt, label, type, required, config, options, }) => {
|
|
34
35
|
const body = {};
|
|
35
36
|
if (prompt !== undefined)
|
|
36
37
|
body.prompt = prompt;
|
|
38
|
+
if (label !== undefined)
|
|
39
|
+
body.label = label;
|
|
37
40
|
if (type !== undefined)
|
|
38
41
|
body.type = type;
|
|
39
42
|
if (required !== undefined)
|
|
@@ -49,6 +52,8 @@ export function registerUpdateQuestionTool(server) {
|
|
|
49
52
|
const updates = [];
|
|
50
53
|
if (prompt !== undefined)
|
|
51
54
|
updates.push(`Prompt → "${prompt}"`);
|
|
55
|
+
if (label !== undefined)
|
|
56
|
+
updates.push(`Label → "${label}"`);
|
|
52
57
|
if (type !== undefined)
|
|
53
58
|
updates.push(`Type → ${type}`);
|
|
54
59
|
if (required !== undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-question.js","sourceRoot":"","sources":["../../src/tools/update-question.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAqB,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"update-question.js","sourceRoot":"","sources":["../../src/tools/update-question.ts"],"names":[],"mappings":"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"}
|