@sellable/mcp 0.1.571 → 0.1.573-phase102.202607122257

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/dist/index-dev.js CHANGED
File without changes
package/dist/index.js CHANGED
File without changes
package/dist/server.js CHANGED
@@ -11,7 +11,7 @@ import { fillCampaignHorizon } from "./tools/campaign-horizon-fill.js";
11
11
  import { cancelPrepareCampaignMessages, getPrepareCampaignMessagesStatus, startPrepareCampaignMessages, } from "./tools/campaign-message-preparation.js";
12
12
  import { getCampaignTableSchema, queueCampaignCells, recordCampaignReviewBatch, reviseMessageTemplateAndRerun, selectCampaignCells, waitForCampaignProcessing, } from "./tools/campaign-processing.js";
13
13
  import { getCampaignRefillState } from "./tools/campaign-refill-state.js";
14
- import { archiveCampaign, createCampaign, duplicateCampaign, getCampaign, getCampaignMessagesPreview, getCampaigns, pauseCampaign, startCampaign, updateCampaign, updateCampaignBrief, } from "./tools/campaigns.js";
14
+ import { archiveCampaign, createCampaign, duplicateCampaign, getCampaign, getCampaignMessagesPreview, getCampaigns, pauseCampaign, startCampaign, updateCampaign, updateCampaignBrief, validateCampaign1KickoffHandoff, } from "./tools/campaigns.js";
15
15
  import { queueCells, updateCell } from "./tools/cells.js";
16
16
  import { handleStartCliLogin, handleWaitForCliLogin, } from "./tools/cli-login.js";
17
17
  import { handleDeleteColumn } from "./tools/column-delete.js";
@@ -334,6 +334,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
334
334
  if (result?.id)
335
335
  markCampaignContextDirty(result.id, "create_campaign");
336
336
  break;
337
+ case "validate_campaign1_kickoff_handoff":
338
+ result = validateCampaign1KickoffHandoff(args);
339
+ break;
337
340
  case "update_campaign":
338
341
  result = await updateCampaign(args?.campaignId, args);
339
342
  if (result?._campaign?.id) {
@@ -1,6 +1,7 @@
1
1
  import { getConfig } from "../auth.js";
2
2
  import { type InteractionMode } from "./interaction-mode.js";
3
3
  import type { CampaignOfferNavigation } from "./navigation.js";
4
+ import { type Campaign1KickoffHandoffInput, type Campaign1KickoffHandoffValidationResult } from "../utils/campaign1KickoffHandoff.js";
4
5
  declare const LEAD_SOURCE_PROVIDERS: {
5
6
  readonly APOLLO: "apollo-ai";
6
7
  readonly SALES_NAV: "sales-nav";
@@ -153,6 +154,101 @@ export interface UpdateCampaignInput {
153
154
  rubric?: unknown[];
154
155
  }
155
156
  export declare const campaignToolDefinitions: ({
157
+ name: string;
158
+ description: string;
159
+ inputSchema: {
160
+ type: string;
161
+ additionalProperties: boolean;
162
+ properties: {
163
+ handoffMarkdown: {
164
+ type: string;
165
+ minLength: number;
166
+ description: string;
167
+ };
168
+ binding: {
169
+ type: string;
170
+ additionalProperties: boolean;
171
+ properties: {
172
+ clientName: {
173
+ type: string;
174
+ minLength: number;
175
+ };
176
+ engagementId: {
177
+ type: string;
178
+ minLength: number;
179
+ };
180
+ workspaceId: {
181
+ type: string;
182
+ minLength: number;
183
+ };
184
+ senderId: {
185
+ type: string;
186
+ minLength: number;
187
+ };
188
+ };
189
+ required: string[];
190
+ };
191
+ expected: {
192
+ type: string;
193
+ additionalProperties: boolean;
194
+ properties: {
195
+ clientName: {
196
+ type: string;
197
+ minLength: number;
198
+ };
199
+ engagementId: {
200
+ type: string;
201
+ minLength: number;
202
+ };
203
+ workspaceId: {
204
+ type: string;
205
+ minLength: number;
206
+ };
207
+ senderId: {
208
+ type: string;
209
+ minLength: number;
210
+ };
211
+ senderName: {
212
+ type: string;
213
+ minLength: number;
214
+ };
215
+ pageRevision: {
216
+ type: string;
217
+ minLength: number;
218
+ };
219
+ };
220
+ required: string[];
221
+ };
222
+ campaignId?: undefined;
223
+ name?: undefined;
224
+ limit?: undefined;
225
+ tableId?: undefined;
226
+ leadLimit?: undefined;
227
+ page?: undefined;
228
+ filters?: undefined;
229
+ clientProspectId?: undefined;
230
+ senderLinkedinUrl?: undefined;
231
+ offerPositioning?: undefined;
232
+ campaignBrief?: undefined;
233
+ messageGenerationMode?: undefined;
234
+ currentStep?: undefined;
235
+ watchNarration?: undefined;
236
+ leadSourceType?: undefined;
237
+ leadSourceProvider?: undefined;
238
+ selectedLeadListId?: undefined;
239
+ senderIds?: undefined;
240
+ currentStepTransition?: undefined;
241
+ clearCurrentStepIfMatches?: undefined;
242
+ interactionMode?: undefined;
243
+ enableICPFilters?: undefined;
244
+ useMessagingTemplate?: undefined;
245
+ rubric?: undefined;
246
+ flowVersion?: undefined;
247
+ workspaceId?: undefined;
248
+ };
249
+ required: string[];
250
+ };
251
+ } | {
156
252
  name: string;
157
253
  description: string;
158
254
  inputSchema: {
@@ -162,6 +258,9 @@ export declare const campaignToolDefinitions: ({
162
258
  type: string;
163
259
  description: string;
164
260
  };
261
+ handoffMarkdown?: undefined;
262
+ binding?: undefined;
263
+ expected?: undefined;
165
264
  name?: undefined;
166
265
  limit?: undefined;
167
266
  tableId?: undefined;
@@ -206,6 +305,9 @@ export declare const campaignToolDefinitions: ({
206
305
  maxLength: number;
207
306
  description: string;
208
307
  };
308
+ handoffMarkdown?: undefined;
309
+ binding?: undefined;
310
+ expected?: undefined;
209
311
  limit?: undefined;
210
312
  tableId?: undefined;
211
313
  leadLimit?: undefined;
@@ -244,6 +346,9 @@ export declare const campaignToolDefinitions: ({
244
346
  type: string;
245
347
  description: string;
246
348
  };
349
+ handoffMarkdown?: undefined;
350
+ binding?: undefined;
351
+ expected?: undefined;
247
352
  campaignId?: undefined;
248
353
  name?: undefined;
249
354
  tableId?: undefined;
@@ -283,6 +388,9 @@ export declare const campaignToolDefinitions: ({
283
388
  type: string;
284
389
  description: string;
285
390
  };
391
+ handoffMarkdown?: undefined;
392
+ binding?: undefined;
393
+ expected?: undefined;
286
394
  name?: undefined;
287
395
  limit?: undefined;
288
396
  tableId?: undefined;
@@ -369,6 +477,9 @@ export declare const campaignToolDefinitions: ({
369
477
  additionalProperties: boolean;
370
478
  };
371
479
  };
480
+ handoffMarkdown?: undefined;
481
+ binding?: undefined;
482
+ expected?: undefined;
372
483
  name?: undefined;
373
484
  limit?: undefined;
374
485
  clientProspectId?: undefined;
@@ -573,6 +684,9 @@ export declare const campaignToolDefinitions: ({
573
684
  };
574
685
  description: string;
575
686
  };
687
+ handoffMarkdown?: undefined;
688
+ binding?: undefined;
689
+ expected?: undefined;
576
690
  limit?: undefined;
577
691
  tableId?: undefined;
578
692
  leadLimit?: undefined;
@@ -787,6 +901,9 @@ export declare const campaignToolDefinitions: ({
787
901
  enum: string[];
788
902
  description: string;
789
903
  };
904
+ handoffMarkdown?: undefined;
905
+ binding?: undefined;
906
+ expected?: undefined;
790
907
  limit?: undefined;
791
908
  tableId?: undefined;
792
909
  leadLimit?: undefined;
@@ -814,6 +931,9 @@ export declare const campaignToolDefinitions: ({
814
931
  type: string;
815
932
  description: string;
816
933
  };
934
+ handoffMarkdown?: undefined;
935
+ binding?: undefined;
936
+ expected?: undefined;
817
937
  name?: undefined;
818
938
  limit?: undefined;
819
939
  tableId?: undefined;
@@ -856,6 +976,9 @@ export declare const campaignToolDefinitions: ({
856
976
  type: string;
857
977
  description: string;
858
978
  };
979
+ handoffMarkdown?: undefined;
980
+ binding?: undefined;
981
+ expected?: undefined;
859
982
  name?: undefined;
860
983
  limit?: undefined;
861
984
  tableId?: undefined;
@@ -885,6 +1008,7 @@ export declare const campaignToolDefinitions: ({
885
1008
  additionalProperties?: undefined;
886
1009
  };
887
1010
  })[];
1011
+ export declare function validateCampaign1KickoffHandoff(input: Campaign1KickoffHandoffInput): Campaign1KickoffHandoffValidationResult;
888
1012
  export declare function getCampaigns(limit?: number): Promise<Campaign[]>;
889
1013
  export declare function getCampaign(campaignId: string): Promise<CampaignDetail>;
890
1014
  export declare function getCampaignMessagesPreview(input: CampaignMessagesPreviewInput): Promise<CampaignMessagesPreviewResult>;
@@ -4,6 +4,7 @@ import { assertCreateCampaignPromptLoaded, assertNetNewCreateCampaignResearchRea
4
4
  import { setCampaignInteractionMode, } from "./interaction-mode.js";
5
5
  import { isLinkedInProfileInput, normalizeLinkedInProfileInput, } from "./linkedin-url.js";
6
6
  import { fetchCampaignRubrics } from "./processing.js";
7
+ import { parseCampaign1KickoffHandoff, } from "../utils/campaign1KickoffHandoff.js";
7
8
  const LEAD_SOURCE_PROVIDERS = {
8
9
  APOLLO: "apollo-ai",
9
10
  SALES_NAV: "sales-nav",
@@ -189,6 +190,53 @@ function assertBriefHandoffWatchUrl(watchUrl, campaignId) {
189
190
  "with create_campaign({ campaignId }) or get_campaign before asking for approval.");
190
191
  }
191
192
  export const campaignToolDefinitions = [
193
+ {
194
+ name: "validate_campaign1_kickoff_handoff",
195
+ description: "Read-only validation for exact inline sellable.kickoff.campaign1.v1 Markdown plus its Admin result binding. Returns sufficient Campaign 1 intake and campaign-brief Markdown without reading a URL, creating a campaign, sourcing/importing leads, or advancing approval gates.",
196
+ inputSchema: {
197
+ type: "object",
198
+ additionalProperties: false,
199
+ properties: {
200
+ handoffMarkdown: {
201
+ type: "string",
202
+ minLength: 1,
203
+ description: "Exact inline Markdown returned by admin_onboarding_call finalize. URL-only input is not accepted.",
204
+ },
205
+ binding: {
206
+ type: "object",
207
+ additionalProperties: false,
208
+ properties: {
209
+ clientName: { type: "string", minLength: 1 },
210
+ engagementId: { type: "string", minLength: 1 },
211
+ workspaceId: { type: "string", minLength: 1 },
212
+ senderId: { type: "string", minLength: 1 },
213
+ },
214
+ required: ["clientName", "engagementId", "workspaceId", "senderId"],
215
+ },
216
+ expected: {
217
+ type: "object",
218
+ additionalProperties: false,
219
+ properties: {
220
+ clientName: { type: "string", minLength: 1 },
221
+ engagementId: { type: "string", minLength: 1 },
222
+ workspaceId: { type: "string", minLength: 1 },
223
+ senderId: { type: "string", minLength: 1 },
224
+ senderName: { type: "string", minLength: 1 },
225
+ pageRevision: { type: "string", minLength: 1 },
226
+ },
227
+ required: [
228
+ "clientName",
229
+ "engagementId",
230
+ "workspaceId",
231
+ "senderId",
232
+ "senderName",
233
+ "pageRevision",
234
+ ],
235
+ },
236
+ },
237
+ required: ["handoffMarkdown", "binding", "expected"],
238
+ },
239
+ },
192
240
  {
193
241
  name: "archive_campaign",
194
242
  description: "Archive a campaign through Sellable's product archive endpoint. This is an explicit cleanup/archive action, is idempotent, and may unschedule pending cells owned by that campaign table. Do not use from refill/setup commands unless the user explicitly asked to archive exact campaign ids.",
@@ -527,6 +575,9 @@ export const campaignToolDefinitions = [
527
575
  },
528
576
  },
529
577
  ];
578
+ export function validateCampaign1KickoffHandoff(input) {
579
+ return parseCampaign1KickoffHandoff(input);
580
+ }
530
581
  export async function getCampaigns(limit) {
531
582
  const api = getApi();
532
583
  const params = limit ? `?limit=${limit}` : "";
@@ -1085,6 +1085,101 @@ export declare const allTools: ({
1085
1085
  };
1086
1086
  required: string[];
1087
1087
  };
1088
+ } | {
1089
+ name: string;
1090
+ description: string;
1091
+ inputSchema: {
1092
+ type: string;
1093
+ additionalProperties: boolean;
1094
+ properties: {
1095
+ handoffMarkdown: {
1096
+ type: string;
1097
+ minLength: number;
1098
+ description: string;
1099
+ };
1100
+ binding: {
1101
+ type: string;
1102
+ additionalProperties: boolean;
1103
+ properties: {
1104
+ clientName: {
1105
+ type: string;
1106
+ minLength: number;
1107
+ };
1108
+ engagementId: {
1109
+ type: string;
1110
+ minLength: number;
1111
+ };
1112
+ workspaceId: {
1113
+ type: string;
1114
+ minLength: number;
1115
+ };
1116
+ senderId: {
1117
+ type: string;
1118
+ minLength: number;
1119
+ };
1120
+ };
1121
+ required: string[];
1122
+ };
1123
+ expected: {
1124
+ type: string;
1125
+ additionalProperties: boolean;
1126
+ properties: {
1127
+ clientName: {
1128
+ type: string;
1129
+ minLength: number;
1130
+ };
1131
+ engagementId: {
1132
+ type: string;
1133
+ minLength: number;
1134
+ };
1135
+ workspaceId: {
1136
+ type: string;
1137
+ minLength: number;
1138
+ };
1139
+ senderId: {
1140
+ type: string;
1141
+ minLength: number;
1142
+ };
1143
+ senderName: {
1144
+ type: string;
1145
+ minLength: number;
1146
+ };
1147
+ pageRevision: {
1148
+ type: string;
1149
+ minLength: number;
1150
+ };
1151
+ };
1152
+ required: string[];
1153
+ };
1154
+ campaignId?: undefined;
1155
+ name?: undefined;
1156
+ limit?: undefined;
1157
+ tableId?: undefined;
1158
+ leadLimit?: undefined;
1159
+ page?: undefined;
1160
+ filters?: undefined;
1161
+ clientProspectId?: undefined;
1162
+ senderLinkedinUrl?: undefined;
1163
+ offerPositioning?: undefined;
1164
+ campaignBrief?: undefined;
1165
+ messageGenerationMode?: undefined;
1166
+ currentStep?: undefined;
1167
+ watchNarration?: undefined;
1168
+ leadSourceType?: undefined;
1169
+ leadSourceProvider?: undefined;
1170
+ selectedLeadListId?: undefined;
1171
+ senderIds?: undefined;
1172
+ currentStepTransition?: undefined;
1173
+ clearCurrentStepIfMatches?: undefined;
1174
+ interactionMode?: undefined;
1175
+ enableICPFilters?: undefined;
1176
+ useMessagingTemplate?: undefined;
1177
+ rubric?: undefined;
1178
+ flowVersion?: undefined;
1179
+ workspaceId?: undefined;
1180
+ };
1181
+ required: string[];
1182
+ };
1088
1183
  } | {
1089
1184
  name: string;
1090
1185
  description: string;
@@ -1095,6 +1190,9 @@ export declare const allTools: ({
1095
1190
  type: string;
1096
1191
  description: string;
1097
1192
  };
1193
+ handoffMarkdown?: undefined;
1194
+ binding?: undefined;
1195
+ expected?: undefined;
1098
1196
  name?: undefined;
1099
1197
  limit?: undefined;
1100
1198
  tableId?: undefined;
@@ -1139,6 +1237,9 @@ export declare const allTools: ({
1139
1237
  maxLength: number;
1140
1238
  description: string;
1141
1239
  };
1240
+ handoffMarkdown?: undefined;
1241
+ binding?: undefined;
1242
+ expected?: undefined;
1142
1243
  limit?: undefined;
1143
1244
  tableId?: undefined;
1144
1245
  leadLimit?: undefined;
@@ -1177,6 +1278,9 @@ export declare const allTools: ({
1177
1278
  type: string;
1178
1279
  description: string;
1179
1280
  };
1281
+ handoffMarkdown?: undefined;
1282
+ binding?: undefined;
1283
+ expected?: undefined;
1180
1284
  campaignId?: undefined;
1181
1285
  name?: undefined;
1182
1286
  tableId?: undefined;
@@ -1216,6 +1320,9 @@ export declare const allTools: ({
1216
1320
  type: string;
1217
1321
  description: string;
1218
1322
  };
1323
+ handoffMarkdown?: undefined;
1324
+ binding?: undefined;
1325
+ expected?: undefined;
1219
1326
  name?: undefined;
1220
1327
  limit?: undefined;
1221
1328
  tableId?: undefined;
@@ -1302,6 +1409,9 @@ export declare const allTools: ({
1302
1409
  additionalProperties: boolean;
1303
1410
  };
1304
1411
  };
1412
+ handoffMarkdown?: undefined;
1413
+ binding?: undefined;
1414
+ expected?: undefined;
1305
1415
  name?: undefined;
1306
1416
  limit?: undefined;
1307
1417
  clientProspectId?: undefined;
@@ -1506,6 +1616,9 @@ export declare const allTools: ({
1506
1616
  };
1507
1617
  description: string;
1508
1618
  };
1619
+ handoffMarkdown?: undefined;
1620
+ binding?: undefined;
1621
+ expected?: undefined;
1509
1622
  limit?: undefined;
1510
1623
  tableId?: undefined;
1511
1624
  leadLimit?: undefined;
@@ -1720,6 +1833,9 @@ export declare const allTools: ({
1720
1833
  enum: string[];
1721
1834
  description: string;
1722
1835
  };
1836
+ handoffMarkdown?: undefined;
1837
+ binding?: undefined;
1838
+ expected?: undefined;
1723
1839
  limit?: undefined;
1724
1840
  tableId?: undefined;
1725
1841
  leadLimit?: undefined;
@@ -1747,6 +1863,9 @@ export declare const allTools: ({
1747
1863
  type: string;
1748
1864
  description: string;
1749
1865
  };
1866
+ handoffMarkdown?: undefined;
1867
+ binding?: undefined;
1868
+ expected?: undefined;
1750
1869
  name?: undefined;
1751
1870
  limit?: undefined;
1752
1871
  tableId?: undefined;
@@ -1789,6 +1908,9 @@ export declare const allTools: ({
1789
1908
  type: string;
1790
1909
  description: string;
1791
1910
  };
1911
+ handoffMarkdown?: undefined;
1912
+ binding?: undefined;
1913
+ expected?: undefined;
1792
1914
  name?: undefined;
1793
1915
  limit?: undefined;
1794
1916
  tableId?: undefined;
@@ -0,0 +1,76 @@
1
+ export declare const CAMPAIGN_1_KICKOFF_SCHEMA_ID: "sellable.kickoff.campaign1.v1";
2
+ export declare const CAMPAIGN_1_KICKOFF_LABELS: readonly ["Client", "Page revision", "Readiness", "Campaign name", "Campaign objective", "Sender", "Sender public URL", "Product", "Value", "Pain", "Outcome", "Proof", "Prohibited claims", "Target companies", "Buyer roles", "Anti-buyers", "Exclusions", "Geography", "DNC dependency", "Dream account", "Ideal buyer", "Why it fits", "Lookalike 1", "Lookalike 2", "Lookalike 3", "LinkedIn topics", "LinkedIn conversations", "LinkedIn creators", "LinkedIn posts", "Participant behavior", "Offer", "CTA", "Message direction", "Voice constraints", "Sender credibility", "Representative sample plan", "Launch operator", "Activation", "Outstanding blockers"];
3
+ export type Campaign1KickoffLabel = (typeof CAMPAIGN_1_KICKOFF_LABELS)[number];
4
+ export type Campaign1KickoffBinding = {
5
+ clientName: string;
6
+ engagementId: string;
7
+ workspaceId: string;
8
+ senderId: string;
9
+ };
10
+ export type Campaign1KickoffExpectedBinding = Campaign1KickoffBinding & {
11
+ pageRevision: string;
12
+ senderName: string;
13
+ };
14
+ export type Campaign1KickoffHandoffInput = {
15
+ handoffMarkdown: string;
16
+ binding: Campaign1KickoffBinding;
17
+ expected: Campaign1KickoffExpectedBinding;
18
+ };
19
+ export type Campaign1KickoffSignalDiscovery = {
20
+ topics: string;
21
+ conversations: string;
22
+ creators: string;
23
+ posts: string;
24
+ participantBehavior: string;
25
+ };
26
+ export type Campaign1KickoffIntake = {
27
+ client: string;
28
+ pageRevision: string;
29
+ campaignName: string;
30
+ campaignObjective: string;
31
+ sender: {
32
+ name: string;
33
+ publicUrl: string;
34
+ };
35
+ product: string;
36
+ value: string;
37
+ pain: string;
38
+ outcome: string;
39
+ proof: string;
40
+ prohibitedClaims: string;
41
+ targetCompanies: string;
42
+ buyerRoles: string;
43
+ antiBuyers: string;
44
+ exclusions: string;
45
+ geography: string;
46
+ dncDependency: string;
47
+ dreamAccount: string;
48
+ idealBuyer: string;
49
+ whyItFits: string;
50
+ lookalikes: readonly [string, string, string];
51
+ signalDiscovery: Campaign1KickoffSignalDiscovery;
52
+ offer: string;
53
+ cta: string;
54
+ messageDirection: string;
55
+ voiceConstraints: string;
56
+ senderCredibility: string;
57
+ representativeSamplePlan: string;
58
+ launchOperator: string;
59
+ activation: string;
60
+ outstandingBlockers: string;
61
+ };
62
+ export type Campaign1KickoffHandoffErrorCode = "missing_handoff" | "duplicate_handoff" | "unsupported_schema" | "malformed_handoff" | "unexpected_field" | "missing_required_value" | "stale_revision" | "handoff_not_ready" | "binding_mismatch";
63
+ export type Campaign1KickoffHandoffValidationResult = {
64
+ ok: true;
65
+ schemaVersion: typeof CAMPAIGN_1_KICKOFF_SCHEMA_ID;
66
+ handoffMarkdown: string;
67
+ binding: Campaign1KickoffBinding;
68
+ intake: Campaign1KickoffIntake;
69
+ campaignBriefMarkdown: string;
70
+ sourceSeeds: readonly [];
71
+ } | {
72
+ ok: false;
73
+ code: Campaign1KickoffHandoffErrorCode;
74
+ message: string;
75
+ };
76
+ export declare function parseCampaign1KickoffHandoff(input: Campaign1KickoffHandoffInput): Campaign1KickoffHandoffValidationResult;