@clipform/mcp-server 3.3.2 → 3.7.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.
@@ -6,7 +6,7 @@ import {
6
6
  getWorkflowText,
7
7
  objectType,
8
8
  registerPrompts
9
- } from "./chunk-5J5N7KTW.js";
9
+ } from "./chunk-GJ3XQSQY.js";
10
10
  import {
11
11
  GUIDE_TYPES,
12
12
  QUIZ_VARIANTS,
@@ -15,13 +15,18 @@ import {
15
15
  getGuideUri,
16
16
  guideFallbackText,
17
17
  registerResources
18
- } from "./chunk-KHRY3A3M.js";
18
+ } from "./chunk-5SCRFNYJ.js";
19
+ import {
20
+ ANON_PREVIEW_NOTICE,
21
+ FULL_CAPS,
22
+ anonPreviewNotice,
23
+ capsFromToolsets
24
+ } from "./chunk-YOVLSXPW.js";
19
25
  import {
20
26
  ACTIVE_NODE_TYPES,
21
27
  CONTACT_FIELDS,
22
28
  FEATURE_FLAGS,
23
29
  FORM_TYPE_ALIASES,
24
- FULL_CAPS,
25
30
  MCP_ANON_PUBLISH_GATE,
26
31
  MCP_TOOL_SECURITY,
27
32
  MCP_TOOL_TIERS,
@@ -31,7 +36,6 @@ import {
31
36
  authChallengeMeta,
32
37
  bfsOrder,
33
38
  callApi,
34
- capsFromToolsets,
35
39
  defaultTarget,
36
40
  errorResult,
37
41
  exposedCompositionIds,
@@ -39,12 +43,12 @@ import {
39
43
  resolveFormType,
40
44
  structuredResult,
41
45
  textResult
42
- } from "./chunk-65MTGAFF.js";
46
+ } from "./chunk-SHTP4AJC.js";
43
47
  import {
44
48
  getMcpAuth,
45
49
  runWithMcpAuth,
46
50
  runWithMcpTool
47
- } from "./chunk-A5CFGL27.js";
51
+ } from "./chunk-VPF6MLKM.js";
48
52
  import {
49
53
  __commonJS,
50
54
  __export,
@@ -17240,7 +17244,7 @@ function registerCreateFormTool(server) {
17240
17244
  "clipform_create_form",
17241
17245
  {
17242
17246
  title: "Create Clipform",
17243
- description: `Create a new Clipform (interactive video-style form). Returns a viewer URL and form ID. When connected via an authenticated MCP client (e.g. claude.ai), the form lands directly in the user's workspace. Anonymous sessions get a claim URL to transfer ownership later.
17247
+ description: `Create a new Clipform (interactive video-style form). Returns a viewer URL and form ID. When connected via an authenticated MCP client (e.g. claude.ai), the form lands directly in the user's workspace. Anonymous sessions build into a temporary account of their own: forms stay drafts with a private preview link. Some results also include a one-time claim URL that signs the user into that account; relay it when present.
17244
17248
 
17245
17249
  ${ONBOARDING_OFFER_TOOL_CUE}
17246
17250
 
@@ -17413,6 +17417,8 @@ Example: A form that asks a question, collects contact info, then finishes:
17413
17417
  formUrl ? `The URLs above are exact values; constructed or guessed URLs return 404. Use the ${firstUrlLabel} URL and ${secondUrlLabel} URL as shown.` : `The ${firstUrlLabel} URL above is an exact value; constructed or guessed URLs return 404.`,
17414
17418
  `Pass form_id on follow-up tools (get_form, add_node, attach_node_media, etc.).`
17415
17419
  );
17420
+ const anonNotice = isPreview ? anonPreviewNotice() : null;
17421
+ if (anonNotice) lines.push(``, anonNotice);
17416
17422
  if (planContext) {
17417
17423
  const nodePart = planContext.node_limit === null ? "unlimited nodes" : `up to ${planContext.node_limit} nodes per form`;
17418
17424
  const formPart = planContext.form_limit === null ? "unlimited forms" : `up to ${planContext.form_limit} forms`;
@@ -17683,7 +17689,7 @@ function registerListFormsTool(server) {
17683
17689
  "clipform_list_forms",
17684
17690
  {
17685
17691
  title: "List Clipforms",
17686
- description: `List forms in your workspace with optional filtering. Returns paginated results (cursor-based). next_cursor is included when more results exist. To find or open a form by name, pass search with part of its title instead of paging through results.`,
17692
+ description: `List forms in your workspace with optional filtering. Returns paginated results (cursor-based). next_cursor is included when more results exist. To find or open a form by name, pass search with part of its title instead of paging through results. Needs a signed-in Clipform account (an anonymous session is asked to sign in).`,
17687
17693
  inputSchema: {
17688
17694
  workspace_id: workspaceIdInput,
17689
17695
  limit: external_exports.number().int().min(1).max(100).optional().describe("Number of forms to return (default 25, max 100)"),
@@ -18123,6 +18129,10 @@ Your form is live at: ${viewerUrl}
18123
18129
  Share this URL with respondents. View responses any time with clipform_get_results (form_id: ${form_id})${responsesUrl ? `, or in the dashboard: ${responsesUrl}` : ""}`;
18124
18130
  }
18125
18131
  }
18132
+ const anonNotice = anonPreviewNotice();
18133
+ if (anonNotice) resultText += `
18134
+
18135
+ ${anonNotice}`;
18126
18136
  return structuredResult(resultText, { form_id, updated_fields: updatedFields });
18127
18137
  }
18128
18138
  );
@@ -18157,7 +18167,7 @@ function registerDeleteFormTool(server) {
18157
18167
  "clipform_delete_form",
18158
18168
  {
18159
18169
  title: "Delete Clipform",
18160
- description: `Move a form and all its nodes to the trash. It stops accepting responses immediately and can be restored later. Requires user confirmation before it runs.`,
18170
+ description: `Move a form and all its nodes to the trash. It stops accepting responses immediately and can be restored later. Requires user confirmation before it runs. Needs a signed-in Clipform account (an anonymous session is asked to sign in).`,
18161
18171
  inputSchema: {
18162
18172
  form_id: external_exports.string().uuid().describe("The form UUID to delete (returned by clipform_create_form, not the short share_id from the URL)"),
18163
18173
  confirm: external_exports.boolean().optional().describe(CONFIRM_FIELD_DESCRIPTION)
@@ -18264,7 +18274,7 @@ function registerGetResultsTool(server) {
18264
18274
  "clipform_get_results",
18265
18275
  {
18266
18276
  title: "Get Clipform Results",
18267
- description: `View response counts, choice/action answer breakdowns, and recent open-text answers for a form. Contact, file, draw, camera, and payment answers are counts only - use the dashboard for per-response detail.`,
18277
+ description: `View response counts, choice/action answer breakdowns, and recent open-text answers for a form. Contact, file, draw, camera, and payment answers are counts only - use the dashboard for per-response detail. Needs a signed-in Clipform account (an anonymous session is asked to sign in).`,
18268
18278
  inputSchema: {
18269
18279
  form_id: external_exports.string().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)")
18270
18280
  },
@@ -18367,7 +18377,7 @@ function registerGetResponsesTool(server) {
18367
18377
  "clipform_get_responses",
18368
18378
  {
18369
18379
  title: "List form responses",
18370
- description: "List a Clipform form's individual responses (submissions) with time filtering - complements clipform_get_results (aggregates). Answers questions like 'what came in during the last 24 hours', 'what's the longest answer', 'what did people say'. Text answers plus a non-PII payment summary (amount and status); contact details, file uploads, and audio/video answers are redacted to placeholders and the customer's payment details stay in the dashboard (the responses URL from clipform_get_form). Responses are sorted newest first unless sort: 'oldest'.",
18380
+ description: "List a Clipform form's individual responses (submissions) with time filtering - complements clipform_get_results (aggregates). Answers questions like 'what came in during the last 24 hours', 'what's the longest answer', 'what did people say'. Text answers plus a non-PII payment summary (amount and status); contact details, file uploads, and audio/video answers are redacted to placeholders and the customer's payment details stay in the dashboard (the responses URL from clipform_get_form). Responses are sorted newest first unless sort: 'oldest'. Needs a signed-in Clipform account (an anonymous session is asked to sign in).",
18371
18381
  inputSchema: {
18372
18382
  form_id: external_exports.string().describe("Form UUID (from clipform_list_forms / clipform_create_form)"),
18373
18383
  since: external_exports.string().datetime({ offset: true }).optional().describe("Only responses submitted at or after this ISO 8601 time (e.g. '2026-08-29T00:00:00Z')"),
@@ -18504,7 +18514,7 @@ function registerWhoamiTool(server) {
18504
18514
  "clipform_whoami",
18505
18515
  {
18506
18516
  title: "Who Am I",
18507
- description: `Show the current identity: auth mode (api key, oauth, session, or anonymous), active workspace, and plan limits.`,
18517
+ description: `Show the current identity: auth mode (api key, oauth, session, or anonymous), active workspace, and plan limits. Needs a signed-in Clipform account (an anonymous session is asked to sign in).`,
18508
18518
  inputSchema: {},
18509
18519
  outputSchema: {
18510
18520
  auth_mode: external_exports.enum(["api_key", "oauth", "session", "anonymous"]).describe("How this session is authenticated"),
@@ -18521,7 +18531,8 @@ function registerWhoamiTool(server) {
18521
18531
  links: external_exports.object({
18522
18532
  dashboard: external_exports.string().describe("Dashboard home for the active workspace."),
18523
18533
  forms: external_exports.string().describe("Forms list for the active workspace.")
18524
- }).optional().describe("Workspace-level dashboard links - only present for a non-anonymous caller.")
18534
+ }).optional().describe("Workspace-level dashboard links - only present for a non-anonymous caller."),
18535
+ notice: external_exports.string().optional().describe("Anonymous sessions only: the account is a temporary preview until claimed.")
18525
18536
  },
18526
18537
  annotations: {
18527
18538
  readOnlyHint: true,
@@ -18576,6 +18587,8 @@ function registerWhoamiTool(server) {
18576
18587
  );
18577
18588
  }
18578
18589
  if (authMode === "anonymous") {
18590
+ structured.notice = ANON_PREVIEW_NOTICE;
18591
+ lines.push(ANON_PREVIEW_NOTICE);
18579
18592
  lines.push(
18580
18593
  "Anonymous session: forms are previews until claimed. Open the claim URL from clipform_create_form (or sign up) to claim the workspace and publish."
18581
18594
  );
@@ -20422,12 +20435,18 @@ function registerListAssetsTool(server) {
20422
20435
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
20423
20436
  },
20424
20437
  async ({ type }) => {
20425
- const result = await callApi("/internal/assets", {
20426
- method: "GET",
20427
- params: { type: type ?? "all" }
20428
- });
20429
- if (!result.ok) return errorResult(result.error);
20430
- const data = result.data;
20438
+ const loader = getMcpAuth()?.loadInternalContent;
20439
+ let data;
20440
+ if (loader) {
20441
+ data = await loader("assets", { type: type ?? "all" });
20442
+ } else {
20443
+ const result = await callApi("/internal/assets", {
20444
+ method: "GET",
20445
+ params: { type: type ?? "all" }
20446
+ });
20447
+ if (!result.ok) return errorResult(result.error);
20448
+ data = result.data;
20449
+ }
20431
20450
  const lines = [];
20432
20451
  const structured = {
20433
20452
  sfx: (data.sfx ?? []).map((s) => ({ name: s.name, description: s.description ?? null, path: s.path })),
@@ -20972,4 +20991,4 @@ export {
20972
20991
  buildInstructions,
20973
20992
  createServer
20974
20993
  };
20975
- //# sourceMappingURL=chunk-7I765YTD.js.map
20994
+ //# sourceMappingURL=chunk-PXHGG57Z.js.map