@clipform/mcp-server 1.8.1 → 1.9.1

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 (118) hide show
  1. package/dist/auth-context.js +9 -0
  2. package/dist/auth-context.js.map +1 -0
  3. package/dist/chunk-ESDD3WVD.js +24686 -0
  4. package/dist/chunk-ESDD3WVD.js.map +1 -0
  5. package/dist/chunk-YEDU3G7I.js +48 -0
  6. package/dist/chunk-YEDU3G7I.js.map +1 -0
  7. package/dist/index.js +108 -11
  8. package/dist/index.js.map +1 -1
  9. package/dist/server.js +7 -74
  10. package/dist/server.js.map +1 -1
  11. package/package.json +7 -8
  12. package/dist/__tests__/api-parity.test.d.ts +0 -1
  13. package/dist/__tests__/api-parity.test.js +0 -157
  14. package/dist/__tests__/api-parity.test.js.map +0 -1
  15. package/dist/__tests__/config-sync.test.d.ts +0 -1
  16. package/dist/__tests__/config-sync.test.js +0 -16
  17. package/dist/__tests__/config-sync.test.js.map +0 -1
  18. package/dist/index.d.ts +0 -2
  19. package/dist/lib/api-client.d.ts +0 -35
  20. package/dist/lib/api-client.js +0 -126
  21. package/dist/lib/api-client.js.map +0 -1
  22. package/dist/lib/auth-context.d.ts +0 -17
  23. package/dist/lib/auth-context.js +0 -9
  24. package/dist/lib/auth-context.js.map +0 -1
  25. package/dist/lib/config.d.ts +0 -23
  26. package/dist/lib/config.js +0 -6
  27. package/dist/lib/config.js.map +0 -1
  28. package/dist/lib/format-form.d.ts +0 -2
  29. package/dist/lib/format-form.js +0 -32
  30. package/dist/lib/format-form.js.map +0 -1
  31. package/dist/lib/render-jobs.d.ts +0 -17
  32. package/dist/lib/render-jobs.js +0 -44
  33. package/dist/lib/render-jobs.js.map +0 -1
  34. package/dist/lib/schemas.d.ts +0 -64
  35. package/dist/lib/schemas.js +0 -140
  36. package/dist/lib/schemas.js.map +0 -1
  37. package/dist/lib/session-context.d.ts +0 -1
  38. package/dist/lib/session-context.js +0 -38
  39. package/dist/lib/session-context.js.map +0 -1
  40. package/dist/prompts.d.ts +0 -2
  41. package/dist/prompts.js +0 -272
  42. package/dist/prompts.js.map +0 -1
  43. package/dist/resources.d.ts +0 -2
  44. package/dist/resources.js +0 -336
  45. package/dist/resources.js.map +0 -1
  46. package/dist/server.d.ts +0 -2
  47. package/dist/tools/add-node.d.ts +0 -2
  48. package/dist/tools/add-node.js +0 -48
  49. package/dist/tools/add-node.js.map +0 -1
  50. package/dist/tools/attach-node-audio.d.ts +0 -2
  51. package/dist/tools/attach-node-audio.js +0 -35
  52. package/dist/tools/attach-node-audio.js.map +0 -1
  53. package/dist/tools/check-render.d.ts +0 -2
  54. package/dist/tools/check-render.js +0 -47
  55. package/dist/tools/check-render.js.map +0 -1
  56. package/dist/tools/create-form.d.ts +0 -2
  57. package/dist/tools/create-form.js +0 -199
  58. package/dist/tools/create-form.js.map +0 -1
  59. package/dist/tools/delete-form.d.ts +0 -2
  60. package/dist/tools/delete-form.js +0 -26
  61. package/dist/tools/delete-form.js.map +0 -1
  62. package/dist/tools/delete-node-media.d.ts +0 -2
  63. package/dist/tools/delete-node-media.js +0 -25
  64. package/dist/tools/delete-node-media.js.map +0 -1
  65. package/dist/tools/delete-node.d.ts +0 -2
  66. package/dist/tools/delete-node.js +0 -28
  67. package/dist/tools/delete-node.js.map +0 -1
  68. package/dist/tools/generate-slideshow.d.ts +0 -2
  69. package/dist/tools/generate-slideshow.js +0 -155
  70. package/dist/tools/generate-slideshow.js.map +0 -1
  71. package/dist/tools/generate-tts.d.ts +0 -2
  72. package/dist/tools/generate-tts.js +0 -73
  73. package/dist/tools/generate-tts.js.map +0 -1
  74. package/dist/tools/generate-video.d.ts +0 -2
  75. package/dist/tools/generate-video.js +0 -119
  76. package/dist/tools/generate-video.js.map +0 -1
  77. package/dist/tools/get-form.d.ts +0 -2
  78. package/dist/tools/get-form.js +0 -25
  79. package/dist/tools/get-form.js.map +0 -1
  80. package/dist/tools/get-node-media.d.ts +0 -2
  81. package/dist/tools/get-node-media.js +0 -35
  82. package/dist/tools/get-node-media.js.map +0 -1
  83. package/dist/tools/list-assets.d.ts +0 -2
  84. package/dist/tools/list-assets.js +0 -45
  85. package/dist/tools/list-assets.js.map +0 -1
  86. package/dist/tools/list-compositions.d.ts +0 -2
  87. package/dist/tools/list-compositions.js +0 -34
  88. package/dist/tools/list-compositions.js.map +0 -1
  89. package/dist/tools/list-forms.d.ts +0 -2
  90. package/dist/tools/list-forms.js +0 -86
  91. package/dist/tools/list-forms.js.map +0 -1
  92. package/dist/tools/log-generation.d.ts +0 -2
  93. package/dist/tools/log-generation.js +0 -33
  94. package/dist/tools/log-generation.js.map +0 -1
  95. package/dist/tools/render-composition.d.ts +0 -2
  96. package/dist/tools/render-composition.js +0 -50
  97. package/dist/tools/render-composition.js.map +0 -1
  98. package/dist/tools/search-media.d.ts +0 -2
  99. package/dist/tools/search-media.js +0 -40
  100. package/dist/tools/search-media.js.map +0 -1
  101. package/dist/tools/search-music.d.ts +0 -2
  102. package/dist/tools/search-music.js +0 -40
  103. package/dist/tools/search-music.js.map +0 -1
  104. package/dist/tools/search-news.d.ts +0 -2
  105. package/dist/tools/search-news.js +0 -47
  106. package/dist/tools/search-news.js.map +0 -1
  107. package/dist/tools/set-node-logic.d.ts +0 -2
  108. package/dist/tools/set-node-logic.js +0 -54
  109. package/dist/tools/set-node-logic.js.map +0 -1
  110. package/dist/tools/update-form.d.ts +0 -2
  111. package/dist/tools/update-form.js +0 -155
  112. package/dist/tools/update-form.js.map +0 -1
  113. package/dist/tools/update-node.d.ts +0 -2
  114. package/dist/tools/update-node.js +0 -70
  115. package/dist/tools/update-node.js.map +0 -1
  116. package/dist/tools/upload-node-media.d.ts +0 -2
  117. package/dist/tools/upload-node-media.js +0 -105
  118. package/dist/tools/upload-node-media.js.map +0 -1
@@ -1,70 +0,0 @@
1
- import { z } from "zod";
2
- import { ACTIVE_NODE_TYPES, CONFIG_DESCRIPTION, OptionSchema } 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 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).`,
9
- inputSchema: {
10
- form_id: z.string().uuid().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
11
- node_id: z.string().describe("The node ID to update"),
12
- prompt: z.string().optional().describe("New question text"),
13
- label: z.string().optional().describe("Short label for the question (used in logic builder)"),
14
- type: z
15
- .enum(ACTIVE_NODE_TYPES)
16
- .optional()
17
- .describe("Change the question type"),
18
- required: z.boolean().optional().describe("Whether an answer is required"),
19
- config: z
20
- .record(z.unknown())
21
- .optional()
22
- .describe(CONFIG_DESCRIPTION),
23
- options: z
24
- .array(OptionSchema)
25
- .optional()
26
- .describe("Replace all options (for choice questions). Omit to keep existing options."),
27
- },
28
- annotations: {
29
- readOnlyHint: false,
30
- destructiveHint: false,
31
- idempotentHint: true,
32
- openWorldHint: true,
33
- },
34
- }, async ({ form_id, node_id, prompt, label, type, required, config, options, }) => {
35
- const body = {};
36
- if (prompt !== undefined)
37
- body.prompt = prompt;
38
- if (label !== undefined)
39
- body.label = label;
40
- if (type !== undefined)
41
- body.type = type;
42
- if (required !== undefined)
43
- body.required = required;
44
- if (config !== undefined)
45
- body.config = config;
46
- if (options !== undefined)
47
- body.options = options;
48
- const result = await callApi(`/forms/${form_id}/nodes/${node_id}`, { method: "PATCH", body });
49
- if (!result.ok) {
50
- return errorResult(result.error);
51
- }
52
- const updates = [];
53
- if (prompt !== undefined)
54
- updates.push(`Prompt → "${prompt}"`);
55
- if (label !== undefined)
56
- updates.push(`Label → "${label}"`);
57
- if (type !== undefined)
58
- updates.push(`Type → ${type}`);
59
- if (required !== undefined)
60
- updates.push(`Required → ${required}`);
61
- if (config !== undefined)
62
- updates.push(`Config updated`);
63
- if (options !== undefined)
64
- updates.push(`Options → ${options.map((o) => o.content).join(", ")}`);
65
- const confirmMsg = `Node ${node_id} updated:\n${updates.join("\n")}`;
66
- const formState = await fetchAndFormatFormState(form_id);
67
- return textResult(formState ? `${confirmMsg}\n\n---\n\n${formState}` : confirmMsg);
68
- });
69
- }
70
- //# sourceMappingURL=update-node.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-node.js","sourceRoot":"","sources":["../../src/tools/update-node.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerUploadNodeMediaTool(server: McpServer): void;
@@ -1,105 +0,0 @@
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
- items: z
49
- .array(MediaItemSchema)
50
- .min(1)
51
- .max(10)
52
- .describe("One or more media items to upload"),
53
- },
54
- annotations: {
55
- readOnlyHint: false,
56
- destructiveHint: false,
57
- idempotentHint: false,
58
- openWorldHint: true,
59
- },
60
- }, async ({ form_id, items }) => {
61
- const lines = [];
62
- let successCount = 0;
63
- for (let i = 0; i < items.length; i++) {
64
- const item = items[i];
65
- if (items.length > 1)
66
- lines.push(`--- Item ${i + 1} (node ${item.node_id}) ---`);
67
- const body = {
68
- media_type: item.media_type,
69
- media_source: item.media_source,
70
- };
71
- if (item.url)
72
- body.url = item.url;
73
- if (item.captions)
74
- body.captions = item.captions;
75
- if (item.show_captions !== undefined)
76
- body.show_captions = item.show_captions;
77
- const result = await callApi(`/forms/${form_id}/nodes/${item.node_id}/media`, { method: "POST", body });
78
- if (result.ok) {
79
- successCount++;
80
- const resultLines = [`Media ID: ${result.data.media_id}`];
81
- if (result.data.upload_url) {
82
- 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"}.`);
83
- }
84
- if (item.captions) {
85
- resultLines.push(`Captions: ${item.captions.length} segments saved`);
86
- }
87
- lines.push(resultLines.join("\n"));
88
- }
89
- else {
90
- lines.push(`FAILED: ${result.error}`);
91
- }
92
- lines.push("");
93
- }
94
- if (items.length > 1) {
95
- lines.unshift(`Media upload: ${successCount}/${items.length} succeeded\n`);
96
- }
97
- else if (successCount > 0) {
98
- lines.unshift(`Media uploaded successfully.`);
99
- }
100
- if (successCount === 0)
101
- return errorResult(lines.join("\n"));
102
- return textResult(lines.join("\n"));
103
- });
104
- }
105
- //# sourceMappingURL=upload-node-media.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upload-node-media.js","sourceRoot":"","sources":["../../src/tools/upload-node-media.ts"],"names":[],"mappings":"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"}