@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.
- package/README.md +42 -29
- package/dist/__tests__/api-parity.test.js +31 -22
- package/dist/__tests__/api-parity.test.js.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +2 -0
- package/dist/lib/api-client.js +10 -0
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/format-form.d.ts +2 -0
- package/dist/lib/format-form.js +32 -0
- package/dist/lib/format-form.js.map +1 -0
- package/dist/lib/render-jobs.d.ts +13 -0
- package/dist/lib/render-jobs.js +38 -0
- package/dist/lib/render-jobs.js.map +1 -0
- package/dist/lib/schemas.d.ts +4 -4
- package/dist/lib/schemas.js +11 -11
- package/dist/lib/schemas.js.map +1 -1
- package/dist/lib/session-context.js +9 -3
- package/dist/lib/session-context.js.map +1 -1
- package/dist/prompts.js +31 -10
- package/dist/prompts.js.map +1 -1
- package/dist/resources.js +3 -3
- package/dist/resources.js.map +1 -1
- package/dist/server.js +23 -21
- package/dist/server.js.map +1 -1
- package/dist/tools/add-node.d.ts +2 -0
- package/dist/tools/add-node.js +50 -0
- package/dist/tools/add-node.js.map +1 -0
- package/dist/tools/attach-node-audio.d.ts +2 -0
- package/dist/tools/{attach-question-audio.js → attach-node-audio.js} +9 -9
- package/dist/tools/attach-node-audio.js.map +1 -0
- package/dist/tools/{add-question.d.ts → check-render.d.ts} +1 -1
- package/dist/tools/check-render.js +47 -0
- package/dist/tools/check-render.js.map +1 -0
- package/dist/tools/create-form.js +43 -25
- package/dist/tools/create-form.js.map +1 -1
- package/dist/tools/delete-node-media.d.ts +2 -0
- package/dist/tools/{delete-question-media.js → delete-node-media.js} +9 -9
- package/dist/tools/delete-node-media.js.map +1 -0
- package/dist/tools/delete-node.d.ts +2 -0
- package/dist/tools/delete-node.js +32 -0
- package/dist/tools/delete-node.js.map +1 -0
- package/dist/tools/generate-slideshow.js +16 -10
- package/dist/tools/generate-slideshow.js.map +1 -1
- package/dist/tools/generate-tts.js +55 -31
- package/dist/tools/generate-tts.js.map +1 -1
- package/dist/tools/generate-video.js +17 -11
- package/dist/tools/generate-video.js.map +1 -1
- package/dist/tools/get-form.js +4 -25
- package/dist/tools/get-form.js.map +1 -1
- package/dist/tools/get-node-media.d.ts +2 -0
- package/dist/tools/{get-question-media.js → get-node-media.js} +9 -9
- package/dist/tools/get-node-media.js.map +1 -0
- package/dist/tools/render-composition.js +18 -13
- package/dist/tools/render-composition.js.map +1 -1
- package/dist/tools/search-media.js +1 -1
- package/dist/tools/search-media.js.map +1 -1
- package/dist/tools/set-node-logic.d.ts +2 -0
- package/dist/tools/{set-question-logic.js → set-node-logic.js} +18 -16
- package/dist/tools/set-node-logic.js.map +1 -0
- package/dist/tools/update-form.js +4 -1
- package/dist/tools/update-form.js.map +1 -1
- package/dist/tools/update-node.d.ts +2 -0
- package/dist/tools/{update-question.js → update-node.js} +14 -11
- package/dist/tools/update-node.js.map +1 -0
- package/dist/tools/upload-node-media.d.ts +2 -0
- package/dist/tools/upload-node-media.js +109 -0
- package/dist/tools/upload-node-media.js.map +1 -0
- package/package.json +1 -1
- package/dist/tools/add-question.js +0 -47
- package/dist/tools/add-question.js.map +0 -1
- package/dist/tools/attach-question-audio.d.ts +0 -2
- package/dist/tools/attach-question-audio.js.map +0 -1
- package/dist/tools/delete-question-media.d.ts +0 -2
- package/dist/tools/delete-question-media.js.map +0 -1
- package/dist/tools/delete-question.d.ts +0 -2
- package/dist/tools/delete-question.js +0 -29
- package/dist/tools/delete-question.js.map +0 -1
- package/dist/tools/get-question-media.d.ts +0 -2
- package/dist/tools/get-question-media.js.map +0 -1
- package/dist/tools/set-question-logic.d.ts +0 -2
- package/dist/tools/set-question-logic.js.map +0 -1
- package/dist/tools/update-question.d.ts +0 -2
- package/dist/tools/update-question.js.map +0 -1
- package/dist/tools/upload-question-media.d.ts +0 -2
- package/dist/tools/upload-question-media.js +0 -77
- package/dist/tools/upload-question-media.js.map +0 -1
|
@@ -1,36 +1,37 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
+
import { fetchAndFormatFormState } from "../lib/format-form.js";
|
|
3
4
|
const LogicRuleSchema = z.object({
|
|
4
5
|
option_content: z
|
|
5
6
|
.string()
|
|
6
7
|
.optional()
|
|
7
8
|
.describe("The option text to match. Omit for a default rule (applies to all unmatched options)."),
|
|
8
|
-
|
|
9
|
+
target_node_id: z
|
|
9
10
|
.string()
|
|
10
|
-
.describe("The
|
|
11
|
+
.describe("The node ID to jump to when this rule matches"),
|
|
11
12
|
});
|
|
12
|
-
export function
|
|
13
|
+
export function registerSetNodeLogicTool(server) {
|
|
13
14
|
server.registerTool("clipform_set_logic", {
|
|
14
|
-
title: "Set
|
|
15
|
-
description: `Set branching logic on a
|
|
15
|
+
title: "Set Node Logic",
|
|
16
|
+
description: `Set branching logic on a node. Routes respondents to different nodes based on their answer.
|
|
16
17
|
|
|
17
|
-
Each rule maps an option (by its text content) to a target
|
|
18
|
+
Each rule maps an option (by its text content) to a target node. Rules without option_content are "default" rules applied to all unmatched options.
|
|
18
19
|
|
|
19
20
|
Example: Route correct answer to a "Well done" node, everything else to "Wrong":
|
|
20
21
|
rules: [
|
|
21
|
-
{ option_content: "42",
|
|
22
|
-
{
|
|
22
|
+
{ option_content: "42", target_node_id: "well-done-id" },
|
|
23
|
+
{ target_node_id: "wrong-id" }
|
|
23
24
|
]`,
|
|
24
25
|
inputSchema: {
|
|
25
26
|
form_id: z.string().uuid().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
|
|
26
27
|
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."),
|
|
27
|
-
|
|
28
|
+
node_id: z
|
|
28
29
|
.string()
|
|
29
|
-
.describe("The
|
|
30
|
+
.describe("The node ID to set logic on"),
|
|
30
31
|
rules: z
|
|
31
32
|
.array(LogicRuleSchema)
|
|
32
33
|
.min(1)
|
|
33
|
-
.describe("Branching rules. Each maps an option or default to a target
|
|
34
|
+
.describe("Branching rules. Each maps an option or default to a target node."),
|
|
34
35
|
},
|
|
35
36
|
annotations: {
|
|
36
37
|
readOnlyHint: false,
|
|
@@ -38,8 +39,8 @@ Example: Route correct answer to a "Well done" node, everything else to "Wrong":
|
|
|
38
39
|
idempotentHint: true,
|
|
39
40
|
openWorldHint: true,
|
|
40
41
|
},
|
|
41
|
-
}, async ({ form_id, edit_token,
|
|
42
|
-
const result = await callApi(`/forms/${form_id}/
|
|
42
|
+
}, async ({ form_id, edit_token, node_id, rules }) => {
|
|
43
|
+
const result = await callApi(`/forms/${form_id}/nodes/${node_id}/logic`, {
|
|
43
44
|
method: "PUT",
|
|
44
45
|
token: edit_token,
|
|
45
46
|
body: { rules },
|
|
@@ -47,8 +48,9 @@ Example: Route correct answer to a "Well done" node, everything else to "Wrong":
|
|
|
47
48
|
if (!result.ok) {
|
|
48
49
|
return errorResult(result.error);
|
|
49
50
|
}
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
const confirmMsg = `Logic set on node ${node_id}.\nRules created: ${result.data.rules_count}`;
|
|
52
|
+
const formState = await fetchAndFormatFormState(form_id, edit_token);
|
|
53
|
+
return textResult(formState ? `${confirmMsg}\n\n---\n\n${formState}` : confirmMsg);
|
|
52
54
|
});
|
|
53
55
|
}
|
|
54
|
-
//# sourceMappingURL=set-
|
|
56
|
+
//# sourceMappingURL=set-node-logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-node-logic.js","sourceRoot":"","sources":["../../src/tools/set-node-logic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,uFAAuF,CACxF;IACH,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,CAAC,+CAA+C,CAAC;CAC7D,CAAC,CAAC;AAEH,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE;;;;;;;;IAQf;QACE,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,6BAA6B,CAAC;YAC1C,KAAK,EAAE,CAAC;iBACL,KAAK,CAAC,eAAe,CAAC;iBACtB,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,mEAAmE,CAAC;SACjF;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,KAAK,EAAE,EAAE,EAAE;QAChD,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,UAAU,OAAO,QAAQ,EAC1C;YACE,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,EAAE,KAAK,EAAE;SAChB,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,UAAU,GAAG,qBAAqB,OAAO,qBAAqB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9F,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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
+
import { fetchAndFormatFormState } from "../lib/format-form.js";
|
|
3
4
|
export function registerUpdateFormTool(server) {
|
|
4
5
|
server.registerTool("clipform_update_form", {
|
|
5
6
|
title: "Update Clipform",
|
|
@@ -131,7 +132,9 @@ export function registerUpdateFormTool(server) {
|
|
|
131
132
|
updates.push(`Brand name → ${brand_name === null ? "cleared" : `"${brand_name}"`}`);
|
|
132
133
|
if (logo_url !== undefined)
|
|
133
134
|
updates.push(`Logo URL → ${logo_url === null ? "cleared" : logo_url}`);
|
|
134
|
-
|
|
135
|
+
const confirmMsg = `Form updated:\n${updates.join("\n")}`;
|
|
136
|
+
const formState = await fetchAndFormatFormState(form_id, edit_token);
|
|
137
|
+
return textResult(formState ? `${confirmMsg}\n\n---\n\n${formState}` : confirmMsg);
|
|
135
138
|
});
|
|
136
139
|
}
|
|
137
140
|
//# sourceMappingURL=update-form.js.map
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"update-form.js","sourceRoot":"","sources":["../../src/tools/update-form.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { ACTIVE_NODE_TYPES, CONFIG_DESCRIPTION, OptionSchema } from "../lib/schemas.js";
|
|
3
3
|
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
import { fetchAndFormatFormState } from "../lib/format-form.js";
|
|
5
|
+
export function registerUpdateNodeTool(server) {
|
|
6
|
+
server.registerTool("clipform_update_node", {
|
|
7
|
+
title: "Update Node",
|
|
8
|
+
description: `Update an existing node's text, type, config, or options. Use clipform_get_form first to find the node ID. Does not change the node's position in the flow. All type definitions and config schemas are derived from @vid-master/config (answer-types).`,
|
|
8
9
|
inputSchema: {
|
|
9
10
|
form_id: z.string().uuid().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
|
|
10
11
|
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."),
|
|
11
|
-
|
|
12
|
+
node_id: z.string().describe("The node ID to update"),
|
|
12
13
|
prompt: z.string().optional().describe("New question text"),
|
|
13
14
|
label: z.string().optional().describe("Short label for the question (used in logic builder)"),
|
|
14
15
|
type: z
|
|
15
|
-
.enum(
|
|
16
|
+
.enum(ACTIVE_NODE_TYPES)
|
|
16
17
|
.optional()
|
|
17
18
|
.describe("Change the question type"),
|
|
18
19
|
required: z.boolean().optional().describe("Whether an answer is required"),
|
|
@@ -31,7 +32,7 @@ export function registerUpdateQuestionTool(server) {
|
|
|
31
32
|
idempotentHint: true,
|
|
32
33
|
openWorldHint: true,
|
|
33
34
|
},
|
|
34
|
-
}, async ({ form_id, edit_token,
|
|
35
|
+
}, async ({ form_id, edit_token, node_id, prompt, label, type, required, config, options, }) => {
|
|
35
36
|
const body = {};
|
|
36
37
|
if (prompt !== undefined)
|
|
37
38
|
body.prompt = prompt;
|
|
@@ -45,7 +46,7 @@ export function registerUpdateQuestionTool(server) {
|
|
|
45
46
|
body.config = config;
|
|
46
47
|
if (options !== undefined)
|
|
47
48
|
body.options = options;
|
|
48
|
-
const result = await callApi(`/forms/${form_id}/
|
|
49
|
+
const result = await callApi(`/forms/${form_id}/nodes/${node_id}`, { method: "PATCH", body, token: edit_token });
|
|
49
50
|
if (!result.ok) {
|
|
50
51
|
return errorResult(result.error);
|
|
51
52
|
}
|
|
@@ -62,7 +63,9 @@ export function registerUpdateQuestionTool(server) {
|
|
|
62
63
|
updates.push(`Config updated`);
|
|
63
64
|
if (options !== undefined)
|
|
64
65
|
updates.push(`Options → ${options.map((o) => o.content).join(", ")}`);
|
|
65
|
-
|
|
66
|
+
const confirmMsg = `Node ${node_id} updated:\n${updates.join("\n")}`;
|
|
67
|
+
const formState = await fetchAndFormatFormState(form_id, edit_token);
|
|
68
|
+
return textResult(formState ? `${confirmMsg}\n\n---\n\n${formState}` : confirmMsg);
|
|
66
69
|
});
|
|
67
70
|
}
|
|
68
|
-
//# sourceMappingURL=update-
|
|
71
|
+
//# sourceMappingURL=update-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-node.js","sourceRoot":"","sources":["../../src/tools/update-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
+
const MediaItemSchema = z.object({
|
|
4
|
+
node_id: z.string().describe("The node ID"),
|
|
5
|
+
media_type: z.enum(["video", "still"]).describe("Type of media"),
|
|
6
|
+
media_source: z
|
|
7
|
+
.enum(["uploaded", "recorded"])
|
|
8
|
+
.default("uploaded")
|
|
9
|
+
.describe("How the media was created"),
|
|
10
|
+
url: z
|
|
11
|
+
.string()
|
|
12
|
+
.url()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Public URL of the media file. When provided, the server fetches and stores it directly."),
|
|
15
|
+
captions: z
|
|
16
|
+
.array(z.object({
|
|
17
|
+
start: z.number().describe("Segment start time in seconds"),
|
|
18
|
+
end: z.number().describe("Segment end time in seconds"),
|
|
19
|
+
text: z.string().describe("Full segment text"),
|
|
20
|
+
words: z
|
|
21
|
+
.array(z.object({
|
|
22
|
+
word: z.string(),
|
|
23
|
+
start: z.number(),
|
|
24
|
+
end: z.number(),
|
|
25
|
+
}))
|
|
26
|
+
.optional()
|
|
27
|
+
.describe("Per-word timestamps within the segment"),
|
|
28
|
+
}))
|
|
29
|
+
.optional()
|
|
30
|
+
.describe("Word-level captions from clipform_generate_tts. Always include when uploading narrated video - pass the full objects including 'words' so per-word highlighting works."),
|
|
31
|
+
show_captions: z
|
|
32
|
+
.boolean()
|
|
33
|
+
.optional()
|
|
34
|
+
.default(true)
|
|
35
|
+
.describe("Display captions/subtitles on the question"),
|
|
36
|
+
});
|
|
37
|
+
export function registerUploadNodeMediaTool(server) {
|
|
38
|
+
server.registerTool("clipform_upload_node_media", {
|
|
39
|
+
title: "Upload Node Media",
|
|
40
|
+
description: `Upload media for one or more nodes. Pass one item or many (max 10). Multiple items upload sequentially.
|
|
41
|
+
|
|
42
|
+
When a public URL is provided, the media is fetched and stored automatically. Only works on node types that support media (choice, open, scale, button). For video: ingested via Mux. For image: stored in Supabase. When attaching TTS narration video, always include captions from clipform_generate_tts.`,
|
|
43
|
+
inputSchema: {
|
|
44
|
+
form_id: z
|
|
45
|
+
.string()
|
|
46
|
+
.uuid()
|
|
47
|
+
.describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
|
|
48
|
+
edit_token: z
|
|
49
|
+
.string()
|
|
50
|
+
.optional()
|
|
51
|
+
.describe("The edit token. Required for anonymous (non-OAuth) sessions; omit when connected via an authenticated MCP client like claude.ai."),
|
|
52
|
+
items: z
|
|
53
|
+
.array(MediaItemSchema)
|
|
54
|
+
.min(1)
|
|
55
|
+
.max(10)
|
|
56
|
+
.describe("One or more media items to upload"),
|
|
57
|
+
},
|
|
58
|
+
annotations: {
|
|
59
|
+
readOnlyHint: false,
|
|
60
|
+
destructiveHint: false,
|
|
61
|
+
idempotentHint: false,
|
|
62
|
+
openWorldHint: true,
|
|
63
|
+
},
|
|
64
|
+
}, async ({ form_id, edit_token, items }) => {
|
|
65
|
+
const lines = [];
|
|
66
|
+
let successCount = 0;
|
|
67
|
+
for (let i = 0; i < items.length; i++) {
|
|
68
|
+
const item = items[i];
|
|
69
|
+
if (items.length > 1)
|
|
70
|
+
lines.push(`--- Item ${i + 1} (node ${item.node_id}) ---`);
|
|
71
|
+
const body = {
|
|
72
|
+
media_type: item.media_type,
|
|
73
|
+
media_source: item.media_source,
|
|
74
|
+
};
|
|
75
|
+
if (item.url)
|
|
76
|
+
body.url = item.url;
|
|
77
|
+
if (item.captions)
|
|
78
|
+
body.captions = item.captions;
|
|
79
|
+
if (item.show_captions !== undefined)
|
|
80
|
+
body.show_captions = item.show_captions;
|
|
81
|
+
const result = await callApi(`/forms/${form_id}/nodes/${item.node_id}/media`, { method: "POST", token: edit_token, body });
|
|
82
|
+
if (result.ok) {
|
|
83
|
+
successCount++;
|
|
84
|
+
const resultLines = [`Media ID: ${result.data.media_id}`];
|
|
85
|
+
if (result.data.upload_url) {
|
|
86
|
+
resultLines.push(`Upload URL: ${result.data.upload_url}`, `Upload method: ${result.data.upload_method}`, `Upload the file directly to the upload URL using ${result.data.upload_method === "tus" ? "TUS resumable upload" : "HTTP PUT"}.`);
|
|
87
|
+
}
|
|
88
|
+
if (item.captions) {
|
|
89
|
+
resultLines.push(`Captions: ${item.captions.length} segments saved`);
|
|
90
|
+
}
|
|
91
|
+
lines.push(resultLines.join("\n"));
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
lines.push(`FAILED: ${result.error}`);
|
|
95
|
+
}
|
|
96
|
+
lines.push("");
|
|
97
|
+
}
|
|
98
|
+
if (items.length > 1) {
|
|
99
|
+
lines.unshift(`Media upload: ${successCount}/${items.length} succeeded\n`);
|
|
100
|
+
}
|
|
101
|
+
else if (successCount > 0) {
|
|
102
|
+
lines.unshift(`Media uploaded successfully.`);
|
|
103
|
+
}
|
|
104
|
+
if (successCount === 0)
|
|
105
|
+
return errorResult(lines.join("\n"));
|
|
106
|
+
return textResult(lines.join("\n"));
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=upload-node-media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-node-media.js","sourceRoot":"","sources":["../../src/tools/upload-node-media.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { QuestionSchema, QUESTION_TYPES_DESCRIPTION } from "../lib/schemas.js";
|
|
3
|
-
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
4
|
-
export function registerAddQuestionTool(server) {
|
|
5
|
-
server.registerTool("clipform_add_question", {
|
|
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
|
-
|
|
11
|
-
All type definitions and config schemas are derived from @vid-master/config (answer-types).`,
|
|
12
|
-
inputSchema: {
|
|
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
|
-
question: QuestionSchema.describe("The question to add"),
|
|
16
|
-
after_question_id: z
|
|
17
|
-
.string()
|
|
18
|
-
.optional()
|
|
19
|
-
.describe("Insert after this question ID. Omit to append before the end screen."),
|
|
20
|
-
},
|
|
21
|
-
annotations: {
|
|
22
|
-
readOnlyHint: false,
|
|
23
|
-
destructiveHint: false,
|
|
24
|
-
idempotentHint: false,
|
|
25
|
-
openWorldHint: true,
|
|
26
|
-
},
|
|
27
|
-
}, async ({ form_id, edit_token, question, after_question_id }) => {
|
|
28
|
-
const body = { question };
|
|
29
|
-
if (after_question_id)
|
|
30
|
-
body.after_question_id = after_question_id;
|
|
31
|
-
const result = await callApi(`/forms/${form_id}/questions`, {
|
|
32
|
-
method: "POST",
|
|
33
|
-
body,
|
|
34
|
-
token: edit_token,
|
|
35
|
-
});
|
|
36
|
-
if (!result.ok) {
|
|
37
|
-
return errorResult(result.error);
|
|
38
|
-
}
|
|
39
|
-
return textResult([
|
|
40
|
-
`Question added successfully!`,
|
|
41
|
-
`Question ID: ${result.data.question_id}`,
|
|
42
|
-
`Type: ${question.type}`,
|
|
43
|
-
`Prompt: ${question.prompt}`,
|
|
44
|
-
].join("\n"));
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=add-question.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
-
export function registerDeleteQuestionTool(server) {
|
|
4
|
-
server.registerTool("clipform_delete_question", {
|
|
5
|
-
title: "Delete Question",
|
|
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
|
-
inputSchema: {
|
|
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
|
-
question_id: z.string().describe("The question ID to delete"),
|
|
11
|
-
},
|
|
12
|
-
annotations: {
|
|
13
|
-
readOnlyHint: false,
|
|
14
|
-
destructiveHint: true,
|
|
15
|
-
idempotentHint: false,
|
|
16
|
-
openWorldHint: true,
|
|
17
|
-
},
|
|
18
|
-
}, async ({ form_id, edit_token, question_id }) => {
|
|
19
|
-
const result = await callApi(`/forms/${form_id}/questions/${question_id}`, {
|
|
20
|
-
method: "DELETE",
|
|
21
|
-
token: edit_token,
|
|
22
|
-
});
|
|
23
|
-
if (!result.ok) {
|
|
24
|
-
return errorResult(result.error);
|
|
25
|
-
}
|
|
26
|
-
return textResult(`Question ${question_id} deleted. The logic chain has been re-linked.`);
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=delete-question.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-question-media.js","sourceRoot":"","sources":["../../src/tools/get-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,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,CAAC,YAAY,CACjB,6BAA6B,EAC7B;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,mIAAmI;QAChJ,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,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,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,KAAK;YACb,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,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAuC,CAAC;QAClE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,UAAU,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,UAAU,CACf,aAAa,KAAK,CAAC,EAAE,IAAI;YACvB,SAAS,KAAK,CAAC,UAAU,IAAI;YAC7B,WAAW,KAAK,CAAC,MAAM,IAAI;YAC3B,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,kBAAkB,KAAK,CAAC,oBAAoB,EAAE,CACjD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"set-question-logic.js","sourceRoot":"","sources":["../../src/tools/set-question-logic.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,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,uFAAuF,CACxF;IACH,kBAAkB,EAAE,CAAC;SAClB,MAAM,EAAE;SACR,QAAQ,CAAC,mDAAmD,CAAC;CACjE,CAAC,CAAC;AAEH,MAAM,UAAU,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE;;;;;;;;IAQf;QACE,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,iCAAiC,CAAC;YAC9C,KAAK,EAAE,CAAC;iBACL,KAAK,CAAC,eAAe,CAAC;iBACtB,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,uEAAuE,CAAC;SACrF;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,KAAK,EAAE,EAAE,EAAE;QACpD,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,cAAc,WAAW,QAAQ,EAClD;YACE,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,EAAE,KAAK,EAAE;SAChB,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,yBAAyB,WAAW,KAAK;YACvC,kBAAkB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAC9C,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-question.js","sourceRoot":"","sources":["../../src/tools/update-question.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
-
export function registerUploadQuestionMediaTool(server) {
|
|
4
|
-
server.registerTool("clipform_upload_question_media", {
|
|
5
|
-
title: "Upload Question Media",
|
|
6
|
-
description: `Upload media for a question. When a public URL is provided, the media is fetched and stored automatically. Only works on question types that support media (choice, open, scale, button). For video: ingested via Mux. For image: stored in Supabase. When attaching TTS narration video, always include captions from clipform_generate_tts.`,
|
|
7
|
-
inputSchema: {
|
|
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
|
-
question_id: z.string().describe("The question ID"),
|
|
11
|
-
media_type: z
|
|
12
|
-
.enum(["video", "still"])
|
|
13
|
-
.describe("Type of media to upload"),
|
|
14
|
-
media_source: z
|
|
15
|
-
.enum(["uploaded", "recorded"])
|
|
16
|
-
.default("uploaded")
|
|
17
|
-
.describe("How the media was created"),
|
|
18
|
-
url: z
|
|
19
|
-
.string()
|
|
20
|
-
.url()
|
|
21
|
-
.optional()
|
|
22
|
-
.describe("Public URL of the media file. When provided, the server fetches and stores it directly."),
|
|
23
|
-
captions: z
|
|
24
|
-
.array(z.object({
|
|
25
|
-
start: z.number().describe("Segment start time in seconds"),
|
|
26
|
-
end: z.number().describe("Segment end time in seconds"),
|
|
27
|
-
text: z.string().describe("Full segment text"),
|
|
28
|
-
words: z
|
|
29
|
-
.array(z.object({
|
|
30
|
-
word: z.string(),
|
|
31
|
-
start: z.number(),
|
|
32
|
-
end: z.number(),
|
|
33
|
-
}))
|
|
34
|
-
.optional()
|
|
35
|
-
.describe("Per-word timestamps within the segment (for word-by-word highlighting)."),
|
|
36
|
-
}))
|
|
37
|
-
.optional()
|
|
38
|
-
.describe("Word-level captions from clipform_generate_tts. Always include when uploading narrated video - pass the full objects including 'words' so per-word highlighting works."),
|
|
39
|
-
show_captions: z
|
|
40
|
-
.boolean()
|
|
41
|
-
.optional()
|
|
42
|
-
.default(true)
|
|
43
|
-
.describe("Display captions/subtitles on the question. Defaults to true."),
|
|
44
|
-
},
|
|
45
|
-
annotations: {
|
|
46
|
-
readOnlyHint: false,
|
|
47
|
-
destructiveHint: false,
|
|
48
|
-
idempotentHint: false,
|
|
49
|
-
openWorldHint: true,
|
|
50
|
-
},
|
|
51
|
-
}, async ({ form_id, edit_token, question_id, media_type, media_source, url, captions, show_captions }) => {
|
|
52
|
-
const body = { media_type, media_source };
|
|
53
|
-
if (url)
|
|
54
|
-
body.url = url;
|
|
55
|
-
if (captions)
|
|
56
|
-
body.captions = captions;
|
|
57
|
-
if (show_captions !== undefined)
|
|
58
|
-
body.show_captions = show_captions;
|
|
59
|
-
const result = await callApi(`/forms/${form_id}/questions/${question_id}/media`, {
|
|
60
|
-
method: "POST",
|
|
61
|
-
token: edit_token,
|
|
62
|
-
body,
|
|
63
|
-
});
|
|
64
|
-
if (!result.ok) {
|
|
65
|
-
return errorResult(result.error);
|
|
66
|
-
}
|
|
67
|
-
const lines = [`Media uploaded successfully.`, `Media ID: ${result.data.media_id}`];
|
|
68
|
-
if (result.data.upload_url) {
|
|
69
|
-
lines.push(`Upload URL: ${result.data.upload_url}`, `Upload method: ${result.data.upload_method}`, `Upload the file directly to the upload URL using ${result.data.upload_method === "tus" ? "TUS resumable upload" : "HTTP PUT"}.`);
|
|
70
|
-
}
|
|
71
|
-
if (captions) {
|
|
72
|
-
lines.push(`Captions: ${captions.length} segments saved`);
|
|
73
|
-
}
|
|
74
|
-
return textResult(lines.join("\n"));
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=upload-question-media.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload-question-media.js","sourceRoot":"","sources":["../../src/tools/upload-question-media.ts"],"names":[],"mappings":"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"}
|