@clipform/mcp-server 1.47.1 → 2.0.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.
@@ -3,7 +3,7 @@ import {
3
3
  FORM_TYPE_KEYS,
4
4
  callApi,
5
5
  getSessionContext
6
- } from "./chunk-PJNOCHKR.js";
6
+ } from "./chunk-GDUJLYR4.js";
7
7
 
8
8
  // src/lib/guides.ts
9
9
  var guidesPromise = null;
@@ -136,4 +136,4 @@ export {
136
136
  getGuideUri,
137
137
  registerResources
138
138
  };
139
- //# sourceMappingURL=chunk-UH77CDNO.js.map
139
+ //# sourceMappingURL=chunk-AP6UGWKC.js.map
@@ -112,8 +112,8 @@ var FEATURES = {
112
112
  status: "live",
113
113
  category: "node-types"
114
114
  },
115
- node_contact: {
116
- name: "Contact form",
115
+ node_details: {
116
+ name: "Details",
117
117
  description: "Structured fields (name, email, phone, company) with consent checkboxes",
118
118
  enabled: true,
119
119
  status: "live",
@@ -195,8 +195,9 @@ var FEATURES = {
195
195
  node_file_download: {
196
196
  name: "File download",
197
197
  description: "Provide files for respondents to download",
198
- enabled: false,
199
- status: "planned",
198
+ enabled: true,
199
+ status: "live",
200
+ wentLiveAt: "2026-07-12",
200
201
  category: "node-types"
201
202
  },
202
203
  node_shopping: {
@@ -871,12 +872,12 @@ var NODE_TYPES = {
871
872
  },
872
873
  output_schema: null
873
874
  },
874
- contact: {
875
- label: "Contact Form",
876
- shorthand: "Contact",
875
+ details: {
876
+ label: "Details",
877
+ shorthand: "Details",
877
878
  icon: "User",
878
879
  color: "#CFFAFE",
879
- description: "Collect standardized contact information (name, email, phone, company)",
880
+ description: "Collect several fields on one screen - name, email, phone, address, date, and more",
880
881
  category: "input",
881
882
  sort_order: 5,
882
883
  has_options: false,
@@ -896,9 +897,9 @@ var NODE_TYPES = {
896
897
  { id: "first_name", type: "first_name", label: "First Name", enabled: true, required: true },
897
898
  { id: "email", type: "email", label: "Email", enabled: true, required: true }
898
899
  ],
899
- consent_items: [
900
- { id: "default-consent", name: "Privacy policy", label: "I agree to the privacy policy and terms of service", order: 0, type: "consent" }
901
- ]
900
+ // No agreement out of the box - the builder adds one via "Add agreement"
901
+ // when they actually need consent, so a fresh node ships no orphan checkbox. (#1378)
902
+ consent_items: []
902
903
  },
903
904
  config_schema: {
904
905
  type: "object",
@@ -913,7 +914,7 @@ var NODE_TYPES = {
913
914
  required: ["id", "required"],
914
915
  properties: {
915
916
  id: { type: "string" },
916
- type: { enum: ["text", "textarea", "email", "tel", "url"], type: "string" },
917
+ type: { enum: ["text", "textarea", "email", "tel", "url", "date", "number"], type: "string" },
917
918
  label: { type: "string" },
918
919
  order: { type: "number" },
919
920
  required: { type: "boolean", default: true },
@@ -976,7 +977,7 @@ var NODE_TYPES = {
976
977
  type: "object",
977
978
  required: ["node_type", "fields"],
978
979
  properties: {
979
- node_type: { type: "string", const: "contact" },
980
+ node_type: { type: "string", const: "details" },
980
981
  fields: {
981
982
  type: "array",
982
983
  items: {
@@ -1090,13 +1091,14 @@ var NODE_TYPES = {
1090
1091
  show_nav_bar: true,
1091
1092
  loading: "lazy",
1092
1093
  supports_prompt: false,
1093
- supports_media: false,
1094
+ supports_media: true,
1094
1095
  is_system: false,
1095
1096
  show_in_results: true,
1096
1097
  default_config: {
1097
1098
  paper_color: "#FAF9F6",
1098
1099
  stroke_colors: ["#1F2937", "#EF4444", "#3B82F6", "#22C55E", "#FACC15"],
1099
- stroke_widths: [3, 6, 12]
1100
+ stroke_widths: [3, 6, 12],
1101
+ background: { fit: "contain", opacity: 1 }
1100
1102
  },
1101
1103
  config_schema: {
1102
1104
  type: "object",
@@ -1119,6 +1121,19 @@ var NODE_TYPES = {
1119
1121
  label: "Pen thicknesses",
1120
1122
  default: [3, 6, 12],
1121
1123
  description: "Stroke widths (px) the respondent can choose"
1124
+ },
1125
+ // The reference image itself is the node's attached media (media_id,
1126
+ // via the same media_asset/create-media.ts pipeline every other
1127
+ // supports_media node uses) - not a config field, to avoid a
1128
+ // duplicated asset ref. This only tunes its display/bake.
1129
+ background: {
1130
+ type: "object",
1131
+ label: "Background image",
1132
+ description: "Display settings for the optional reference image behind the drawing canvas",
1133
+ properties: {
1134
+ fit: { type: "string", enum: ["cover", "contain"], default: "contain", label: "Fit", description: "contain letterboxes the image, cover crops it to fill the canvas" },
1135
+ opacity: { type: "number", minimum: 0, maximum: 1, default: 1, label: "Opacity", description: "Background image opacity, from 0 (invisible) to 1 (fully opaque)" }
1136
+ }
1122
1137
  }
1123
1138
  }
1124
1139
  },
@@ -1353,7 +1368,7 @@ var NODE_TYPES = {
1353
1368
  color: "#FFEDD5",
1354
1369
  description: "Redirect users to an external URL",
1355
1370
  category: "end",
1356
- sort_order: 101,
1371
+ sort_order: 997,
1357
1372
  has_options: false,
1358
1373
  is_terminal: true,
1359
1374
  show_nav_bar: false,
@@ -1383,7 +1398,7 @@ var NODE_TYPES = {
1383
1398
  color: "#FFEDD5",
1384
1399
  description: "Display a list of links for users to choose from",
1385
1400
  category: "end",
1386
- sort_order: 102,
1401
+ sort_order: 998,
1387
1402
  has_options: false,
1388
1403
  is_terminal: true,
1389
1404
  show_nav_bar: false,
@@ -1428,7 +1443,7 @@ var NODE_TYPES = {
1428
1443
  color: "#E9D5FF",
1429
1444
  description: "Provide a file for respondents to download",
1430
1445
  category: "action",
1431
- sort_order: 103,
1446
+ sort_order: 9,
1432
1447
  has_options: false,
1433
1448
  is_terminal: false,
1434
1449
  show_nav_bar: true,
@@ -1446,7 +1461,8 @@ var NODE_TYPES = {
1446
1461
  items: {
1447
1462
  type: "object",
1448
1463
  properties: {
1449
- file_name: { type: "string", label: "Display file name", required: true },
1464
+ file_name: { type: "string", label: "Original file name", required: true },
1465
+ display_name: { type: "string", label: "Friendly name shown to respondents" },
1450
1466
  file_path: { type: "string", label: "File path in storage", required: true },
1451
1467
  file_size: { type: "number", label: "File size in bytes" },
1452
1468
  mime_type: { type: "string", label: "MIME type" }
@@ -1454,7 +1470,7 @@ var NODE_TYPES = {
1454
1470
  },
1455
1471
  label: "Downloadable files"
1456
1472
  },
1457
- button_text: { type: "string", label: "Button text", default: "Download Files" },
1473
+ button_text: { type: "string", label: "Continue button text", default: "Continue" },
1458
1474
  description: { type: "string", label: "Description text" }
1459
1475
  }
1460
1476
  },
@@ -1477,7 +1493,28 @@ var NODE_TYPES = {
1477
1493
  }
1478
1494
  }
1479
1495
  },
1480
- output_schema: null
1496
+ output_schema: {
1497
+ type: "object",
1498
+ required: ["node_type"],
1499
+ properties: {
1500
+ node_type: { type: "string", const: "file_download" },
1501
+ files: {
1502
+ type: "array",
1503
+ description: "The files the respondent downloaded, each a canonical media object with a fresh signed link.",
1504
+ items: {
1505
+ type: "object",
1506
+ properties: {
1507
+ filename: { type: "string", description: "Original filename" },
1508
+ content_type: { type: "string", description: "File MIME type" },
1509
+ downloaded_at: { type: "string", format: "date-time", description: "Timestamp when download was initiated" },
1510
+ url: { type: "string", format: "uri", description: "Direct, time-limited signed link (~48h, supports HTTP range)" },
1511
+ download_url: { type: "string", format: "uri", description: "Same link with a forced download (Content-Disposition: attachment)" },
1512
+ expires_at: { type: "string", format: "date-time", description: "When url/download_url stop working" }
1513
+ }
1514
+ }
1515
+ }
1516
+ }
1517
+ }
1481
1518
  },
1482
1519
  shopping: {
1483
1520
  label: "Shopping",
@@ -1725,7 +1762,7 @@ var FORM_TYPES = {
1725
1762
  aliases: ["case-study", "callout"],
1726
1763
  variants: [],
1727
1764
  required_features: [],
1728
- required_node_types: ["open", "contact", "end_screen"],
1765
+ required_node_types: ["open", "details", "end_screen"],
1729
1766
  default_media_style: "video",
1730
1767
  guide_uri: "clipform://guides/interview",
1731
1768
  guide_description: "Craft knowledge for building interview forms - warm-up pacing, open questions, consent, video responses",
@@ -1747,7 +1784,7 @@ var FORM_TYPES = {
1747
1784
  aliases: ["lead-gen", "qualification", "lead-magnet"],
1748
1785
  variants: [],
1749
1786
  required_features: ["branching", "funnel"],
1750
- required_node_types: ["choice", "contact", "end_screen"],
1787
+ required_node_types: ["choice", "details", "end_screen"],
1751
1788
  default_media_style: "text",
1752
1789
  guide_uri: "clipform://guides/funnel",
1753
1790
  guide_description: "Craft knowledge for lead qualification funnels - planned feature, conditional routing coming soon",
@@ -1765,7 +1802,7 @@ var FORM_TYPES = {
1765
1802
  aliases: ["story", "review"],
1766
1803
  variants: [],
1767
1804
  required_features: [],
1768
- required_node_types: ["open", "contact", "end_screen"],
1805
+ required_node_types: ["open", "details", "end_screen"],
1769
1806
  default_media_style: "video",
1770
1807
  guide_uri: "clipform://guides/testimonial",
1771
1808
  guide_description: "Craft knowledge for collecting testimonials and customer stories on video - storytelling prompts, comfort techniques, consent",
@@ -1786,7 +1823,7 @@ var FORM_TYPES = {
1786
1823
  aliases: ["job-application", "admission", "enrollment", "grant"],
1787
1824
  variants: [],
1788
1825
  required_features: [],
1789
- required_node_types: ["open", "choice", "contact", "end_screen"],
1826
+ required_node_types: ["open", "choice", "details", "end_screen"],
1790
1827
  default_media_style: "video",
1791
1828
  guide_uri: "clipform://guides/application",
1792
1829
  guide_description: "Craft knowledge for application and evaluation forms - multi-section structure, video responses for behavioural questions, screening",
@@ -1806,7 +1843,7 @@ var FORM_TYPES = {
1806
1843
  aliases: ["registration", "signup", "event", "rsvp", "workshop"],
1807
1844
  variants: [],
1808
1845
  required_features: [],
1809
- required_node_types: ["contact", "choice", "end_screen"],
1846
+ required_node_types: ["details", "choice", "end_screen"],
1810
1847
  default_media_style: "text",
1811
1848
  guide_uri: "clipform://guides/booking",
1812
1849
  guide_description: "Craft knowledge for event registration and booking forms - minimal friction, video welcome, confirmation flow",
@@ -1943,7 +1980,8 @@ var BUSINESS = {
1943
1980
  email: {
1944
1981
  support: "support@clipform.io",
1945
1982
  sales: "sales@clipform.io",
1946
- hello: "hello@clipform.io"
1983
+ hello: "hello@clipform.io",
1984
+ founder: "andy@clipform.io"
1947
1985
  },
1948
1986
  urls: getUrls()
1949
1987
  };
@@ -2001,37 +2039,33 @@ var SLIDESHOW_TRANSITIONS = [
2001
2039
  ];
2002
2040
  var COMPOSITION_REGISTRY = [
2003
2041
  // Beds (full-bleed backgrounds)
2004
- { id: "MediaSlideshow", tier: "public", kind: "bed", scene_layer: true },
2042
+ { id: "Slideshow", tier: "public", kind: "bed", scene_layer: true },
2005
2043
  { id: "Map", tier: "public", kind: "bed", scene_layer: true },
2006
2044
  { id: "Grid", tier: "public", kind: "bed", scene_layer: true },
2007
- { id: "ObscuredReveal", tier: "public", kind: "bed" },
2008
- { id: "Timeline", tier: "public", kind: "bed" },
2009
- { id: "NumberLine", tier: "public", kind: "bed" },
2010
- { id: "CountdownRing", tier: "public", kind: "bed" },
2011
- { id: "CountrySilhouetteClip", tier: "public", kind: "bed", scene_layer: true },
2012
- { id: "FlagReveal", tier: "public", kind: "bed" },
2013
- { id: "ColorCards", tier: "public", kind: "bed", scene_layer: true },
2014
- { id: "TitleCard", tier: "public", kind: "bed" },
2015
- { id: "ParallaxImage", tier: "public", kind: "bed" },
2016
- { id: "Spin3D", tier: "labs", kind: "bed", scene_layer: true },
2045
+ { id: "Timeline", tier: "labs", kind: "bed" },
2046
+ { id: "CountrySilhouetteClip", tier: "labs", kind: "bed", scene_layer: true },
2017
2047
  // Overlays (assets layered on a bed)
2018
- { id: "TextReveal", tier: "public", kind: "overlay", scene_layer: true },
2019
- { id: "EmojiPuzzle", tier: "public", kind: "overlay", scene_layer: true },
2020
- { id: "BeforeAfter", tier: "public", kind: "overlay", scene_layer: true },
2021
- { id: "StatCounter", tier: "labs", kind: "overlay", scene_layer: true },
2022
- { id: "ListReveal", tier: "labs", kind: "overlay", scene_layer: true },
2048
+ { id: "Text", tier: "labs", kind: "overlay", scene_layer: true },
2049
+ { id: "Rebus", tier: "labs", kind: "overlay", scene_layer: true },
2023
2050
  // Container
2024
2051
  { id: "Scene", tier: "labs", kind: "container" },
2025
2052
  // Social marketing templates (gated)
2026
- { id: "ShortFormQuiz", tier: "social", kind: "template" },
2027
- { id: "ScorecardQuiz", tier: "social", kind: "template" },
2028
- { id: "ScorecardGK", tier: "social", kind: "template" },
2029
- { id: "CountrySilhouetteQuiz", tier: "social", kind: "template" }
2053
+ { id: "ShortFormQuiz", tier: "social", kind: "video" },
2054
+ { id: "ScorecardQuiz", tier: "social", kind: "video" },
2055
+ { id: "ScorecardGK", tier: "social", kind: "video" },
2056
+ { id: "CountrySilhouetteQuiz", tier: "social", kind: "video" }
2030
2057
  ];
2031
2058
  var compositionIdsByTier = (tier) => COMPOSITION_REGISTRY.filter((c) => c.tier === tier).map((c) => c.id);
2032
2059
  var PUBLIC_COMPOSITION_IDS = compositionIdsByTier("public");
2033
2060
  var LABS_COMPOSITION_IDS = compositionIdsByTier("labs");
2034
2061
  var SOCIAL_COMPOSITION_IDS = compositionIdsByTier("social");
2062
+ function exposedCompositionIds(includeNonPublic) {
2063
+ return [
2064
+ ...PUBLIC_COMPOSITION_IDS,
2065
+ ...includeNonPublic ? LABS_COMPOSITION_IDS : [],
2066
+ ...includeNonPublic ? SOCIAL_COMPOSITION_IDS : []
2067
+ ];
2068
+ }
2035
2069
  var SCENE_LAYER_COMPOSITION_IDS = COMPOSITION_REGISTRY.filter((c) => c.scene_layer).map((c) => c.id);
2036
2070
  var MCP_TOOL_TIERS = {};
2037
2071
 
@@ -2181,6 +2215,12 @@ function textResult(text) {
2181
2215
  content: [{ type: "text", text }]
2182
2216
  };
2183
2217
  }
2218
+ function structuredResult(text, structuredContent) {
2219
+ return {
2220
+ content: [{ type: "text", text }],
2221
+ structuredContent
2222
+ };
2223
+ }
2184
2224
 
2185
2225
  // src/lib/session-context.ts
2186
2226
  async function getSessionContextWithAuth() {
@@ -2251,15 +2291,14 @@ export {
2251
2291
  KEN_BURNS_PRESETS,
2252
2292
  KEN_BURNS_FIT_MODES,
2253
2293
  SLIDESHOW_TRANSITIONS,
2254
- PUBLIC_COMPOSITION_IDS,
2255
- LABS_COMPOSITION_IDS,
2256
- SOCIAL_COMPOSITION_IDS,
2294
+ exposedCompositionIds,
2257
2295
  MCP_TOOL_TIERS,
2258
2296
  setMcpVersion,
2259
2297
  callApi,
2260
2298
  errorResult,
2261
2299
  textResult,
2300
+ structuredResult,
2262
2301
  getSessionContextWithAuth,
2263
2302
  getSessionContext
2264
2303
  };
2265
- //# sourceMappingURL=chunk-PJNOCHKR.js.map
2304
+ //# sourceMappingURL=chunk-GDUJLYR4.js.map