@clipform/mcp-server 1.8.0 → 1.9.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 (116) hide show
  1. package/README.md +3 -2
  2. package/dist/auth-context.js +9 -0
  3. package/dist/auth-context.js.map +1 -0
  4. package/dist/chunk-BWCZX7XY.js +3824 -0
  5. package/dist/chunk-BWCZX7XY.js.map +1 -0
  6. package/dist/chunk-MYWOSQ66.js +15 -0
  7. package/dist/chunk-MYWOSQ66.js.map +1 -0
  8. package/dist/index.js +15 -10
  9. package/dist/index.js.map +1 -1
  10. package/dist/server.js +7 -72
  11. package/dist/server.js.map +1 -1
  12. package/package.json +5 -4
  13. package/dist/__tests__/api-parity.test.d.ts +0 -1
  14. package/dist/__tests__/api-parity.test.js +0 -157
  15. package/dist/__tests__/api-parity.test.js.map +0 -1
  16. package/dist/__tests__/config-sync.test.d.ts +0 -1
  17. package/dist/__tests__/config-sync.test.js +0 -16
  18. package/dist/__tests__/config-sync.test.js.map +0 -1
  19. package/dist/index.d.ts +0 -2
  20. package/dist/lib/api-client.d.ts +0 -36
  21. package/dist/lib/api-client.js +0 -129
  22. package/dist/lib/api-client.js.map +0 -1
  23. package/dist/lib/auth-context.d.ts +0 -17
  24. package/dist/lib/auth-context.js +0 -9
  25. package/dist/lib/auth-context.js.map +0 -1
  26. package/dist/lib/config.d.ts +0 -23
  27. package/dist/lib/config.js +0 -6
  28. package/dist/lib/config.js.map +0 -1
  29. package/dist/lib/format-form.d.ts +0 -2
  30. package/dist/lib/format-form.js +0 -32
  31. package/dist/lib/format-form.js.map +0 -1
  32. package/dist/lib/render-jobs.d.ts +0 -13
  33. package/dist/lib/render-jobs.js +0 -38
  34. package/dist/lib/render-jobs.js.map +0 -1
  35. package/dist/lib/schemas.d.ts +0 -64
  36. package/dist/lib/schemas.js +0 -140
  37. package/dist/lib/schemas.js.map +0 -1
  38. package/dist/lib/session-context.d.ts +0 -1
  39. package/dist/lib/session-context.js +0 -38
  40. package/dist/lib/session-context.js.map +0 -1
  41. package/dist/prompts.d.ts +0 -2
  42. package/dist/prompts.js +0 -272
  43. package/dist/prompts.js.map +0 -1
  44. package/dist/resources.d.ts +0 -2
  45. package/dist/resources.js +0 -336
  46. package/dist/resources.js.map +0 -1
  47. package/dist/server.d.ts +0 -2
  48. package/dist/tools/add-node.d.ts +0 -2
  49. package/dist/tools/add-node.js +0 -50
  50. package/dist/tools/add-node.js.map +0 -1
  51. package/dist/tools/attach-node-audio.d.ts +0 -2
  52. package/dist/tools/attach-node-audio.js +0 -37
  53. package/dist/tools/attach-node-audio.js.map +0 -1
  54. package/dist/tools/check-render.d.ts +0 -2
  55. package/dist/tools/check-render.js +0 -47
  56. package/dist/tools/check-render.js.map +0 -1
  57. package/dist/tools/create-form.d.ts +0 -2
  58. package/dist/tools/create-form.js +0 -217
  59. package/dist/tools/create-form.js.map +0 -1
  60. package/dist/tools/delete-form.d.ts +0 -2
  61. package/dist/tools/delete-form.js +0 -28
  62. package/dist/tools/delete-form.js.map +0 -1
  63. package/dist/tools/delete-node-media.d.ts +0 -2
  64. package/dist/tools/delete-node-media.js +0 -29
  65. package/dist/tools/delete-node-media.js.map +0 -1
  66. package/dist/tools/delete-node.d.ts +0 -2
  67. package/dist/tools/delete-node.js +0 -32
  68. package/dist/tools/delete-node.js.map +0 -1
  69. package/dist/tools/generate-slideshow.d.ts +0 -2
  70. package/dist/tools/generate-slideshow.js +0 -155
  71. package/dist/tools/generate-slideshow.js.map +0 -1
  72. package/dist/tools/generate-tts.d.ts +0 -2
  73. package/dist/tools/generate-tts.js +0 -73
  74. package/dist/tools/generate-tts.js.map +0 -1
  75. package/dist/tools/generate-video.d.ts +0 -2
  76. package/dist/tools/generate-video.js +0 -119
  77. package/dist/tools/generate-video.js.map +0 -1
  78. package/dist/tools/get-form.d.ts +0 -2
  79. package/dist/tools/get-form.js +0 -31
  80. package/dist/tools/get-form.js.map +0 -1
  81. package/dist/tools/get-node-media.d.ts +0 -2
  82. package/dist/tools/get-node-media.js +0 -39
  83. package/dist/tools/get-node-media.js.map +0 -1
  84. package/dist/tools/list-assets.d.ts +0 -2
  85. package/dist/tools/list-assets.js +0 -45
  86. package/dist/tools/list-assets.js.map +0 -1
  87. package/dist/tools/list-compositions.d.ts +0 -2
  88. package/dist/tools/list-compositions.js +0 -34
  89. package/dist/tools/list-compositions.js.map +0 -1
  90. package/dist/tools/log-generation.d.ts +0 -2
  91. package/dist/tools/log-generation.js +0 -34
  92. package/dist/tools/log-generation.js.map +0 -1
  93. package/dist/tools/render-composition.d.ts +0 -2
  94. package/dist/tools/render-composition.js +0 -50
  95. package/dist/tools/render-composition.js.map +0 -1
  96. package/dist/tools/search-media.d.ts +0 -2
  97. package/dist/tools/search-media.js +0 -40
  98. package/dist/tools/search-media.js.map +0 -1
  99. package/dist/tools/search-music.d.ts +0 -2
  100. package/dist/tools/search-music.js +0 -40
  101. package/dist/tools/search-music.js.map +0 -1
  102. package/dist/tools/search-news.d.ts +0 -2
  103. package/dist/tools/search-news.js +0 -47
  104. package/dist/tools/search-news.js.map +0 -1
  105. package/dist/tools/set-node-logic.d.ts +0 -2
  106. package/dist/tools/set-node-logic.js +0 -56
  107. package/dist/tools/set-node-logic.js.map +0 -1
  108. package/dist/tools/update-form.d.ts +0 -2
  109. package/dist/tools/update-form.js +0 -140
  110. package/dist/tools/update-form.js.map +0 -1
  111. package/dist/tools/update-node.d.ts +0 -2
  112. package/dist/tools/update-node.js +0 -71
  113. package/dist/tools/update-node.js.map +0 -1
  114. package/dist/tools/upload-node-media.d.ts +0 -2
  115. package/dist/tools/upload-node-media.js +0 -109
  116. package/dist/tools/upload-node-media.js.map +0 -1
@@ -0,0 +1,15 @@
1
+ // src/lib/auth-context.ts
2
+ import { AsyncLocalStorage } from "async_hooks";
3
+ var storage = new AsyncLocalStorage();
4
+ function runWithMcpAuth(ctx, fn) {
5
+ return storage.run(ctx, fn);
6
+ }
7
+ function getMcpAuth() {
8
+ return storage.getStore();
9
+ }
10
+
11
+ export {
12
+ runWithMcpAuth,
13
+ getMcpAuth
14
+ };
15
+ //# sourceMappingURL=chunk-MYWOSQ66.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/auth-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\n\n/**\n * Identity of the end-user a given MCP request is acting on behalf of.\n *\n * Populated by the in-process host (apps/api) after validating an OAuth\n * Bearer on /mcp. The MCP tool layer reads it to decide which workspace\n * forms should land in and which plan tier gates apply.\n *\n * NOT populated when the server runs as a local stdio process (npx) - in\n * that mode tools fall back to edit-token based auth.\n */\nexport interface McpAuthContext {\n user_id: string;\n workspace_id: string;\n scopes: string[];\n}\n\nconst storage = new AsyncLocalStorage<McpAuthContext>();\n\nexport function runWithMcpAuth<T>(ctx: McpAuthContext, fn: () => Promise<T> | T): Promise<T> | T {\n return storage.run(ctx, fn);\n}\n\nexport function getMcpAuth(): McpAuthContext | undefined {\n return storage.getStore();\n}\n"],"mappings":";AAAA,SAAS,yBAAyB;AAkBlC,IAAM,UAAU,IAAI,kBAAkC;AAE/C,SAAS,eAAkB,KAAqB,IAA0C;AAC/F,SAAO,QAAQ,IAAI,KAAK,EAAE;AAC5B;AAEO,SAAS,aAAyC;AACvD,SAAO,QAAQ,SAAS;AAC1B;","names":[]}
package/dist/index.js CHANGED
@@ -1,16 +1,21 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ createServer,
4
+ setApiKey
5
+ } from "./chunk-BWCZX7XY.js";
6
+ import "./chunk-MYWOSQ66.js";
7
+
8
+ // src/index.ts
2
9
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
- import { createServer } from "./server.js";
4
- import { setApiKey } from "./lib/api-client.js";
5
- const apiKeyArg = process.argv.find((a) => a.startsWith("--api-key="));
6
- const apiKey = apiKeyArg?.split("=")[1] || process.env.CLIPFORM_API_KEY;
10
+ var apiKeyArg = process.argv.find((a) => a.startsWith("--api-key="));
11
+ var apiKey = apiKeyArg?.split("=")[1] || process.env.CLIPFORM_API_KEY;
7
12
  if (apiKey) {
8
- setApiKey(apiKey);
13
+ setApiKey(apiKey);
9
14
  }
10
- const server = createServer();
11
- const transport = new StdioServerTransport();
15
+ var server = createServer();
16
+ var transport = new StdioServerTransport();
12
17
  await server.connect(transport);
13
- console.error(apiKey
14
- ? "Clipform MCP Server running on stdio (API key authenticated)"
15
- : "Clipform MCP Server running on stdio (anonymous mode)");
18
+ console.error(
19
+ apiKey ? "Clipform MCP Server running on stdio (API key authenticated)" : "Clipform MCP Server running on stdio (anonymous mode)"
20
+ );
16
21
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;AACvE,MAAM,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAExE,IAAI,MAAM,EAAE,CAAC;IACX,SAAS,CAAC,MAAM,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;AAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAChC,OAAO,CAAC,KAAK,CACX,MAAM;IACJ,CAAC,CAAC,8DAA8D;IAChE,CAAC,CAAC,uDAAuD,CAC5D,CAAC"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { setApiKey } from \"./lib/api-client.js\";\n\nconst apiKeyArg = process.argv.find((a) => a.startsWith(\"--api-key=\"));\nconst apiKey = apiKeyArg?.split(\"=\")[1] || process.env.CLIPFORM_API_KEY;\n\nif (apiKey) {\n setApiKey(apiKey);\n}\n\nconst server = createServer();\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\nconsole.error(\n apiKey\n ? \"Clipform MCP Server running on stdio (API key authenticated)\"\n : \"Clipform MCP Server running on stdio (anonymous mode)\"\n);\n"],"mappings":";;;;;;;;AACA,SAAS,4BAA4B;AAIrC,IAAM,YAAY,QAAQ,KAAK,KAAK,CAAC,MAAM,EAAE,WAAW,YAAY,CAAC;AACrE,IAAM,SAAS,WAAW,MAAM,GAAG,EAAE,CAAC,KAAK,QAAQ,IAAI;AAEvD,IAAI,QAAQ;AACV,YAAU,MAAM;AAClB;AAEA,IAAM,SAAS,aAAa;AAC5B,IAAM,YAAY,IAAI,qBAAqB;AAC3C,MAAM,OAAO,QAAQ,SAAS;AAC9B,QAAQ;AAAA,EACN,SACI,iEACA;AACN;","names":[]}
package/dist/server.js CHANGED
@@ -1,73 +1,8 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- // Form CRUD tools
3
- import { registerCreateFormTool } from "./tools/create-form.js";
4
- import { registerGetFormTool } from "./tools/get-form.js";
5
- import { registerUpdateFormTool } from "./tools/update-form.js";
6
- import { registerDeleteFormTool } from "./tools/delete-form.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
- // Audit logging
18
- import { registerLogGenerationTool } from "./tools/log-generation.js";
19
- // Content research tools
20
- import { registerSearchNewsTool } from "./tools/search-news.js";
21
- // Creative tools
22
- import { registerGenerateTtsTool } from "./tools/generate-tts.js";
23
- import { registerGenerateSlideshowTool } from "./tools/generate-slideshow.js";
24
- import { registerSearchMediaTool } from "./tools/search-media.js";
25
- import { registerRenderCompositionTool } from "./tools/render-composition.js";
26
- import { registerSearchMusicTool } from "./tools/search-music.js";
27
- import { registerListCompositionsTool } from "./tools/list-compositions.js";
28
- import { registerListAssetsTool } from "./tools/list-assets.js";
29
- import { registerGenerateVideoTool } from "./tools/generate-video.js";
30
- import { registerCheckRenderTool } from "./tools/check-render.js";
31
- // Prompts & Resources
32
- import { registerPrompts } from "./prompts.js";
33
- import { registerResources } from "./resources.js";
34
- export function createServer() {
35
- const server = new McpServer({
36
- name: "clipform-mcp-server",
37
- version: "1.8.0",
38
- });
39
- // Form CRUD
40
- registerCreateFormTool(server);
41
- registerGetFormTool(server);
42
- registerUpdateFormTool(server);
43
- registerDeleteFormTool(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);
54
- // Audit logging
55
- registerLogGenerationTool(server);
56
- // Content research
57
- registerSearchNewsTool(server);
58
- // Creative tools
59
- registerGenerateTtsTool(server);
60
- registerGenerateSlideshowTool(server);
61
- registerGenerateVideoTool(server);
62
- registerSearchMediaTool(server);
63
- registerRenderCompositionTool(server);
64
- registerSearchMusicTool(server);
65
- registerListCompositionsTool(server);
66
- registerListAssetsTool(server);
67
- registerCheckRenderTool(server);
68
- // Prompts & Resources
69
- registerPrompts(server);
70
- registerResources(server);
71
- return server;
72
- }
1
+ import {
2
+ createServer
3
+ } from "./chunk-BWCZX7XY.js";
4
+ import "./chunk-MYWOSQ66.js";
5
+ export {
6
+ createServer
7
+ };
73
8
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clipform/mcp-server",
3
- "version": "1.8.0",
3
+ "version": "1.9.0",
4
4
  "description": "MCP server for building and managing Clipform video forms",
5
5
  "license": "MIT",
6
6
  "homepage": "https://clipform.io",
@@ -9,7 +9,7 @@
9
9
  "exports": {
10
10
  ".": "./dist/index.js",
11
11
  "./server": "./dist/server.js",
12
- "./auth-context": "./dist/lib/auth-context.js"
12
+ "./auth-context": "./dist/auth-context.js"
13
13
  },
14
14
  "bin": {
15
15
  "mcp-server-clipform": "dist/index.js"
@@ -20,15 +20,16 @@
20
20
  "scripts": {
21
21
  "start": "node dist/index.js",
22
22
  "dev": "tsx watch src/index.ts",
23
- "build": "tsc",
23
+ "build": "tsup",
24
+ "type-check": "tsc --noEmit",
24
25
  "test": "vitest run"
25
26
  },
26
27
  "dependencies": {
27
28
  "@modelcontextprotocol/sdk": "^1.12.1",
28
- "@vid-master/config": "*",
29
29
  "zod": "^3.24.4"
30
30
  },
31
31
  "devDependencies": {
32
+ "tsup": "^8.5.1",
32
33
  "tsx": "^4.19.4",
33
34
  "typescript": "^5.2.2",
34
35
  "vitest": "^3.1.1"
@@ -1 +0,0 @@
1
- export {};
@@ -1,157 +0,0 @@
1
- /**
2
- * Verifies that MCP tool input schemas expose all fields that the
3
- * corresponding API endpoints accept. When a new field is added to an
4
- * API route, add it to the map below — the test will fail if the MCP
5
- * tool doesn't expose it yet.
6
- *
7
- * Companion to config-sync.test.ts (which checks node types / contact fields).
8
- */
9
- import { describe, it, expect } from "vitest";
10
- import { registerUpdateFormTool } from "../tools/update-form.js";
11
- import { registerAddNodeTool } from "../tools/add-node.js";
12
- import { registerUpdateNodeTool } from "../tools/update-node.js";
13
- import { registerUploadNodeMediaTool } from "../tools/upload-node-media.js";
14
- import { registerCreateFormTool } from "../tools/create-form.js";
15
- // ---------------------------------------------------------------------------
16
- // Helpers
17
- // ---------------------------------------------------------------------------
18
- /** Mock McpServer that captures the inputSchema from registerTool */
19
- function captureSchema(registerFn) {
20
- let captured = {};
21
- const mockServer = {
22
- registerTool: (_name, def, _handler) => {
23
- captured = def.inputSchema;
24
- },
25
- };
26
- registerFn(mockServer);
27
- return captured;
28
- }
29
- /** Extract top-level field names from a captured Zod inputSchema */
30
- function fieldNames(schema) {
31
- return Object.keys(schema);
32
- }
33
- /** Extract field names from a Zod object schema's .shape */
34
- function shapeFields(zodSchema) {
35
- const shape = zodSchema?._def?.shape;
36
- if (typeof shape === "function")
37
- return Object.keys(shape());
38
- if (shape)
39
- return Object.keys(shape);
40
- return [];
41
- }
42
- /**
43
- * Unwrap Zod wrappers (.optional(), .nullable(), .default()) to get the
44
- * underlying schema. Follows the innerType chain.
45
- */
46
- function unwrap(schema) {
47
- while (schema?._def?.innerType) {
48
- schema = schema._def.innerType;
49
- }
50
- return schema;
51
- }
52
- /** Extract element shape fields from a Zod array schema (possibly wrapped in .optional()) */
53
- function arrayElementFields(zodSchema) {
54
- // Unwrap .optional() / .nullable() / .default()
55
- const arraySchema = unwrap(zodSchema);
56
- // z.array(z.object({...}))._def.type is the z.object
57
- const elemType = arraySchema?._def?.type;
58
- if (elemType)
59
- return shapeFields(elemType);
60
- return [];
61
- }
62
- // ---------------------------------------------------------------------------
63
- // API field map — source of truth for what each API endpoint accepts.
64
- // Update this when adding fields to API routes.
65
- // ---------------------------------------------------------------------------
66
- /**
67
- * Fields that are MCP-internal (auth/routing, not API body fields).
68
- * These are excluded from parity checks.
69
- */
70
- const MCP_ONLY_FIELDS = ["form_id", "edit_token", "node_id", "workspace_id"];
71
- const API_PARITY = {
72
- "update-form": {
73
- register: registerUpdateFormTool,
74
- /** Body fields accepted by PATCH /forms/:formId (apps/api/src/routes/v1/forms/update-form.ts) */
75
- apiBodyFields: ["title", "is_published", "show_step_counter", "disable_back_navigation", "total_steps", "primary_color", "background_color", "font_family"],
76
- },
77
- "create-form": {
78
- register: registerCreateFormTool,
79
- /** Fields the create tool should expose (beyond title/questions which are core) */
80
- apiBodyFields: ["title", "questions", "show_step_counter", "disable_back_navigation", "primary_color", "background_color", "font_family"],
81
- },
82
- "add-node": {
83
- register: registerAddNodeTool,
84
- apiBodyFields: ["question", "after_node_id"],
85
- /** Nested: fields inside the node object */
86
- nodeFields: ["type", "prompt", "label", "required", "config", "options"],
87
- /** Nested: fields inside each option */
88
- optionFields: ["content", "score", "scores"],
89
- },
90
- "update-node": {
91
- register: registerUpdateNodeTool,
92
- apiBodyFields: ["prompt", "label", "type", "required", "config", "options"],
93
- optionFields: ["content", "score", "scores"],
94
- },
95
- "upload-node-media": {
96
- register: registerUploadNodeMediaTool,
97
- /** Body fields accepted by POST /forms/:formId/nodes/:nodeId/media (nested inside items[]) */
98
- apiBodyFields: ["items"],
99
- mediaItemFields: ["node_id", "media_type", "media_source", "url", "captions", "show_captions"],
100
- },
101
- };
102
- // ---------------------------------------------------------------------------
103
- // Tests
104
- // ---------------------------------------------------------------------------
105
- describe("api-parity", () => {
106
- for (const [toolName, spec] of Object.entries(API_PARITY)) {
107
- describe(toolName, () => {
108
- const schema = captureSchema(spec.register);
109
- const mcpFields = fieldNames(schema).filter((f) => !MCP_ONLY_FIELDS.includes(f));
110
- it("exposes all API body fields", () => {
111
- for (const field of spec.apiBodyFields) {
112
- if (MCP_ONLY_FIELDS.includes(field))
113
- continue;
114
- expect(mcpFields, `MCP tool "${toolName}" is missing API field "${field}"`).toContain(field);
115
- }
116
- });
117
- if ("nodeFields" in spec) {
118
- it("node schema exposes all API node fields", () => {
119
- const nodeSchema = schema.question;
120
- const nFields = shapeFields(nodeSchema);
121
- for (const field of spec.nodeFields) {
122
- expect(nFields, `NodeSchema is missing field "${field}"`).toContain(field);
123
- }
124
- });
125
- }
126
- if ("mediaItemFields" in spec) {
127
- it("media item schema exposes all API media fields", () => {
128
- const itemFields = arrayElementFields(schema.items);
129
- for (const field of spec.mediaItemFields) {
130
- expect(itemFields, `MediaItemSchema is missing field "${field}"`).toContain(field);
131
- }
132
- });
133
- }
134
- if ("optionFields" in spec) {
135
- it("option schema exposes all API option fields", () => {
136
- // For add-question: schema.question is a Zod object with shape().options
137
- // For update-question: schema.options is directly on the inputSchema
138
- let optionsSchema;
139
- if (schema.question) {
140
- // Nested inside NodeSchema
141
- const qShape = schema.question._def?.shape;
142
- const shape = typeof qShape === "function" ? qShape() : qShape;
143
- optionsSchema = shape?.options;
144
- }
145
- else {
146
- optionsSchema = schema.options;
147
- }
148
- const optFields = arrayElementFields(optionsSchema);
149
- for (const field of spec.optionFields) {
150
- expect(optFields, `OptionSchema is missing field "${field}"`).toContain(field);
151
- }
152
- });
153
- }
154
- });
155
- }
156
- });
157
- //# sourceMappingURL=api-parity.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-parity.test.js","sourceRoot":"","sources":["../../src/__tests__/api-parity.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,16 +0,0 @@
1
- /**
2
- * Verifies that the MCP server's config re-exports match @vid-master/config.
3
- * This ensures the re-export path is working correctly.
4
- */
5
- import { describe, it, expect } from "vitest";
6
- import { NODE_TYPES as SOURCE_NODE_TYPES, CONTACT_FIELDS as SOURCE_CONTACT_FIELDS, } from "@vid-master/config";
7
- import { NODE_TYPES as MCP_NODE_TYPES, CONTACT_FIELDS as MCP_CONTACT_FIELDS, } from "../lib/config.js";
8
- describe("config-sync", () => {
9
- it("NODE_TYPES re-export matches @vid-master/config", () => {
10
- expect(MCP_NODE_TYPES).toBe(SOURCE_NODE_TYPES);
11
- });
12
- it("CONTACT_FIELDS re-export matches @vid-master/config", () => {
13
- expect(MCP_CONTACT_FIELDS).toBe(SOURCE_CONTACT_FIELDS);
14
- });
15
- });
16
- //# sourceMappingURL=config-sync.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-sync.test.js","sourceRoot":"","sources":["../../src/__tests__/config-sync.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,UAAU,IAAI,iBAAiB,EAC/B,cAAc,IAAI,qBAAqB,GACxC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,UAAU,IAAI,cAAc,EAC5B,cAAc,IAAI,kBAAkB,GACrC,MAAM,kBAAkB,CAAC;AAE1B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
@@ -1,36 +0,0 @@
1
- export declare function setApiKey(key: string): void;
2
- export declare function getApiKey(): string | undefined;
3
- interface ApiOptions {
4
- method?: string;
5
- body?: Record<string, unknown>;
6
- params?: Record<string, string>;
7
- token?: string;
8
- }
9
- type ApiResult = {
10
- ok: true;
11
- data: Record<string, unknown>;
12
- } | {
13
- ok: false;
14
- status: number;
15
- error: string;
16
- };
17
- export declare function callApi(path: string, options?: ApiOptions): Promise<ApiResult>;
18
- /**
19
- * Call an internal API endpoint (formgen, media, etc.)
20
- * Uses INTERNAL_SECRET for auth and INTERNAL_API_URL as base.
21
- */
22
- export declare function callInternalApi(path: string, options?: Omit<ApiOptions, "token">): Promise<ApiResult>;
23
- export declare function errorResult(message: string): {
24
- content: {
25
- type: "text";
26
- text: string;
27
- }[];
28
- isError: boolean;
29
- };
30
- export declare function textResult(text: string): {
31
- content: {
32
- type: "text";
33
- text: string;
34
- }[];
35
- };
36
- export {};
@@ -1,129 +0,0 @@
1
- import { getMcpAuth } from "./auth-context.js";
2
- const DASHBOARD_URL = process.env.SERVER_URL || process.env.DASHBOARD_URL || "https://api.clipform.io";
3
- const API_VERSION = "v1";
4
- const INTERNAL_API_URL = process.env.INTERNAL_API_URL || DASHBOARD_URL;
5
- const INTERNAL_SECRET = process.env.INTERNAL_SERVICE_SECRET || "";
6
- let _apiKey;
7
- export function setApiKey(key) {
8
- _apiKey = key;
9
- }
10
- export function getApiKey() {
11
- return _apiKey;
12
- }
13
- export async function callApi(path, options = {}) {
14
- const { method = "GET", body, params, token } = options;
15
- let url = `${DASHBOARD_URL}/${API_VERSION}${path}`;
16
- if (params) {
17
- const searchParams = new URLSearchParams(params);
18
- url += `?${searchParams.toString()}`;
19
- }
20
- const headers = {
21
- "Content-Type": "application/json",
22
- };
23
- // If the MCP server is running in-process inside the API host AND the
24
- // request has been OAuth-authenticated, forward the end-user identity
25
- // via internal headers instead of propagating the caller's Bearer.
26
- //
27
- // Token passthrough is forbidden by the MCP Authorization spec: the
28
- // token that claude.ai presented was issued for audience `${api}/mcp`
29
- // and must not be replayed against downstream routes like /v1/forms/*.
30
- // Those routes instead trust the INTERNAL_SECRET + X-Mcp-User /
31
- // X-Mcp-Workspace headers set below.
32
- const mcpAuth = getMcpAuth();
33
- if (mcpAuth && INTERNAL_SECRET) {
34
- headers["Authorization"] = `Bearer ${INTERNAL_SECRET}`;
35
- headers["X-Mcp-User"] = mcpAuth.user_id;
36
- headers["X-Mcp-Workspace"] = mcpAuth.workspace_id;
37
- }
38
- else if (_apiKey) {
39
- headers["X-API-Key"] = _apiKey;
40
- }
41
- else if (token) {
42
- headers["Authorization"] = `Bearer ${token}`;
43
- }
44
- const fetchOptions = { method, headers };
45
- if (body && method !== "GET") {
46
- fetchOptions.body = JSON.stringify(body);
47
- }
48
- let response;
49
- try {
50
- response = await fetch(url, fetchOptions);
51
- }
52
- catch (err) {
53
- return {
54
- ok: false,
55
- status: 0,
56
- error: `Failed to connect to dashboard API at ${url}. Make sure the dashboard is running.\n\nError: ${err instanceof Error ? err.message : String(err)}`,
57
- };
58
- }
59
- // 204 No Content — successful delete with no body
60
- if (response.status === 204) {
61
- return { ok: true, data: {} };
62
- }
63
- const data = (await response.json());
64
- if (!response.ok) {
65
- return {
66
- ok: false,
67
- status: response.status,
68
- error: data.error || `API error (${response.status})`,
69
- };
70
- }
71
- return { ok: true, data };
72
- }
73
- /**
74
- * Call an internal API endpoint (formgen, media, etc.)
75
- * Uses INTERNAL_SECRET for auth and INTERNAL_API_URL as base.
76
- */
77
- export async function callInternalApi(path, options = {}) {
78
- const { method = "POST", body, params } = options;
79
- let url = `${INTERNAL_API_URL}${path}`;
80
- if (params) {
81
- const searchParams = new URLSearchParams(params);
82
- url += `?${searchParams.toString()}`;
83
- }
84
- const headers = {
85
- "Content-Type": "application/json",
86
- };
87
- if (INTERNAL_SECRET) {
88
- headers["Authorization"] = `Bearer ${INTERNAL_SECRET}`;
89
- }
90
- const fetchOptions = { method, headers };
91
- if (body && method !== "GET") {
92
- fetchOptions.body = JSON.stringify(body);
93
- }
94
- let response;
95
- try {
96
- response = await fetch(url, fetchOptions);
97
- }
98
- catch (err) {
99
- return {
100
- ok: false,
101
- status: 0,
102
- error: `Failed to connect to internal API at ${url}.\n\nError: ${err instanceof Error ? err.message : String(err)}`,
103
- };
104
- }
105
- if (response.status === 204) {
106
- return { ok: true, data: {} };
107
- }
108
- const data = (await response.json());
109
- if (!response.ok) {
110
- return {
111
- ok: false,
112
- status: response.status,
113
- error: data.error || `Internal API error (${response.status})`,
114
- };
115
- }
116
- return { ok: true, data };
117
- }
118
- export function errorResult(message) {
119
- return {
120
- content: [{ type: "text", text: message }],
121
- isError: true,
122
- };
123
- }
124
- export function textResult(text) {
125
- return {
126
- content: [{ type: "text", text }],
127
- };
128
- }
129
- //# sourceMappingURL=api-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Identity of the end-user a given MCP request is acting on behalf of.
3
- *
4
- * Populated by the in-process host (apps/api) after validating an OAuth
5
- * Bearer on /mcp. The MCP tool layer reads it to decide which workspace
6
- * forms should land in and which plan tier gates apply.
7
- *
8
- * NOT populated when the server runs as a local stdio process (npx) - in
9
- * that mode tools fall back to edit-token based auth.
10
- */
11
- export interface McpAuthContext {
12
- user_id: string;
13
- workspace_id: string;
14
- scopes: string[];
15
- }
16
- export declare function runWithMcpAuth<T>(ctx: McpAuthContext, fn: () => Promise<T> | T): Promise<T> | T;
17
- export declare function getMcpAuth(): McpAuthContext | undefined;
@@ -1,9 +0,0 @@
1
- import { AsyncLocalStorage } from "node:async_hooks";
2
- const storage = new AsyncLocalStorage();
3
- export function runWithMcpAuth(ctx, fn) {
4
- return storage.run(ctx, fn);
5
- }
6
- export function getMcpAuth() {
7
- return storage.getStore();
8
- }
9
- //# sourceMappingURL=auth-context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-context.js","sourceRoot":"","sources":["../../src/lib/auth-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAkBrD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAkB,CAAC;AAExD,MAAM,UAAU,cAAc,CAAI,GAAmB,EAAE,EAAwB;IAC7E,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
@@ -1,23 +0,0 @@
1
- /**
2
- * Re-export from @vid-master/config — single source of truth.
3
- * The MCP server uses NODE_TYPES and CONTACT_FIELDS directly.
4
- */
5
- export { NODE_TYPES, CONTACT_FIELDS } from "@vid-master/config";
6
- export type NodeTypeDefinition = {
7
- label: string;
8
- description: string;
9
- is_active: boolean;
10
- is_system: boolean;
11
- has_options: boolean;
12
- min_options?: number;
13
- max_options?: number;
14
- max_option_length?: number;
15
- config_schema: Record<string, unknown> | null;
16
- };
17
- export type ContactFieldDefinition = {
18
- id: string;
19
- label: string;
20
- type: string;
21
- placeholder: string;
22
- order: number;
23
- };
@@ -1,6 +0,0 @@
1
- /**
2
- * Re-export from @vid-master/config — single source of truth.
3
- * The MCP server uses NODE_TYPES and CONTACT_FIELDS directly.
4
- */
5
- export { NODE_TYPES, CONTACT_FIELDS } from "@vid-master/config";
6
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare function formatFormState(data: Record<string, unknown>): string;
2
- export declare function fetchAndFormatFormState(formId: string, editToken?: string): Promise<string | null>;