@sellable/mcp 0.1.276 → 0.1.277
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.
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
export interface PrepareCampaignAbTestInput {
|
|
2
|
-
sourceCampaignId
|
|
2
|
+
sourceCampaignId?: string;
|
|
3
|
+
sourceLeadListId?: string;
|
|
4
|
+
campaignName?: string;
|
|
5
|
+
campaignBrief?: string;
|
|
6
|
+
offerPositioning?: Record<string, unknown>;
|
|
7
|
+
clientProspectId?: string;
|
|
8
|
+
senderLinkedinUrl?: string;
|
|
3
9
|
variantName: string;
|
|
4
10
|
variantBriefDelta: string;
|
|
5
11
|
variantALabel?: string;
|
|
@@ -22,6 +28,31 @@ export declare const campaignAbTestToolDefinitions: {
|
|
|
22
28
|
type: string;
|
|
23
29
|
description: string;
|
|
24
30
|
};
|
|
31
|
+
sourceLeadListId: {
|
|
32
|
+
type: string;
|
|
33
|
+
description: string;
|
|
34
|
+
};
|
|
35
|
+
campaignName: {
|
|
36
|
+
type: string;
|
|
37
|
+
description: string;
|
|
38
|
+
};
|
|
39
|
+
campaignBrief: {
|
|
40
|
+
type: string;
|
|
41
|
+
description: string;
|
|
42
|
+
};
|
|
43
|
+
offerPositioning: {
|
|
44
|
+
type: string;
|
|
45
|
+
additionalProperties: boolean;
|
|
46
|
+
description: string;
|
|
47
|
+
};
|
|
48
|
+
clientProspectId: {
|
|
49
|
+
type: string;
|
|
50
|
+
description: string;
|
|
51
|
+
};
|
|
52
|
+
senderLinkedinUrl: {
|
|
53
|
+
type: string;
|
|
54
|
+
description: string;
|
|
55
|
+
};
|
|
25
56
|
variantName: {
|
|
26
57
|
type: string;
|
|
27
58
|
description: string;
|
|
@@ -2,13 +2,38 @@ import { getApi } from "../api.js";
|
|
|
2
2
|
export const campaignAbTestToolDefinitions = [
|
|
3
3
|
{
|
|
4
4
|
name: "prepare_campaign_ab_test",
|
|
5
|
-
description: "Prepare a campaign A/B test from an existing campaign
|
|
5
|
+
description: "Prepare a campaign A/B test from an existing campaign, a clean source lead list, or just a campaign idea. If sourceCampaignId is omitted, pass campaignName and campaignBrief so the tool creates the A campaign first and duplicates it for B. sourceLeadListId is optional; when provided the tool also creates deterministic A/B split lead lists and imports those rows. The tool never launches either campaign.",
|
|
6
6
|
inputSchema: {
|
|
7
7
|
type: "object",
|
|
8
8
|
properties: {
|
|
9
9
|
sourceCampaignId: {
|
|
10
10
|
type: "string",
|
|
11
|
-
description: "
|
|
11
|
+
description: "Optional existing source campaign ID. If omitted, campaignName and campaignBrief are required.",
|
|
12
|
+
},
|
|
13
|
+
sourceLeadListId: {
|
|
14
|
+
type: "string",
|
|
15
|
+
description: "Optional clean source lead-list table ID. When supplied, rows are split into A/B lead lists and imported into the draft campaigns.",
|
|
16
|
+
},
|
|
17
|
+
campaignName: {
|
|
18
|
+
type: "string",
|
|
19
|
+
description: "Base campaign name generated from the user's idea when sourceCampaignId is omitted.",
|
|
20
|
+
},
|
|
21
|
+
campaignBrief: {
|
|
22
|
+
type: "string",
|
|
23
|
+
description: "Base campaign brief generated from the user's idea when sourceCampaignId is omitted.",
|
|
24
|
+
},
|
|
25
|
+
offerPositioning: {
|
|
26
|
+
type: "object",
|
|
27
|
+
additionalProperties: true,
|
|
28
|
+
description: "Optional offer positioning JSON to store on the newly created A campaign.",
|
|
29
|
+
},
|
|
30
|
+
clientProspectId: {
|
|
31
|
+
type: "string",
|
|
32
|
+
description: "Optional client prospect ID to store on the newly created A campaign.",
|
|
33
|
+
},
|
|
34
|
+
senderLinkedinUrl: {
|
|
35
|
+
type: "string",
|
|
36
|
+
description: "Optional sender LinkedIn profile URL to preserve in A/B metadata.",
|
|
12
37
|
},
|
|
13
38
|
variantName: {
|
|
14
39
|
type: "string",
|
|
@@ -49,7 +74,7 @@ export const campaignAbTestToolDefinitions = [
|
|
|
49
74
|
description: "Optional stable key for retrying the same A/B preparation safely.",
|
|
50
75
|
},
|
|
51
76
|
},
|
|
52
|
-
required: ["
|
|
77
|
+
required: ["variantName", "variantBriefDelta"],
|
|
53
78
|
additionalProperties: false,
|
|
54
79
|
},
|
|
55
80
|
},
|
package/dist/tools/registry.d.ts
CHANGED
|
@@ -1210,6 +1210,31 @@ export declare const allTools: ({
|
|
|
1210
1210
|
type: string;
|
|
1211
1211
|
description: string;
|
|
1212
1212
|
};
|
|
1213
|
+
sourceLeadListId: {
|
|
1214
|
+
type: string;
|
|
1215
|
+
description: string;
|
|
1216
|
+
};
|
|
1217
|
+
campaignName: {
|
|
1218
|
+
type: string;
|
|
1219
|
+
description: string;
|
|
1220
|
+
};
|
|
1221
|
+
campaignBrief: {
|
|
1222
|
+
type: string;
|
|
1223
|
+
description: string;
|
|
1224
|
+
};
|
|
1225
|
+
offerPositioning: {
|
|
1226
|
+
type: string;
|
|
1227
|
+
additionalProperties: boolean;
|
|
1228
|
+
description: string;
|
|
1229
|
+
};
|
|
1230
|
+
clientProspectId: {
|
|
1231
|
+
type: string;
|
|
1232
|
+
description: string;
|
|
1233
|
+
};
|
|
1234
|
+
senderLinkedinUrl: {
|
|
1235
|
+
type: string;
|
|
1236
|
+
description: string;
|
|
1237
|
+
};
|
|
1213
1238
|
variantName: {
|
|
1214
1239
|
type: string;
|
|
1215
1240
|
description: string;
|
package/package.json
CHANGED
|
@@ -24,18 +24,27 @@ campaign-message approaches from the same source list.
|
|
|
24
24
|
|
|
25
25
|
## Opening Contract
|
|
26
26
|
|
|
27
|
-
Start by identifying the
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
Start by identifying the campaign idea and the one variable being tested. A
|
|
28
|
+
source campaign and clean source lead list are both optional: use an existing
|
|
29
|
+
campaign when the user already has one, use a clean source lead list when leads
|
|
30
|
+
are already available, or use only the idea by writing a campaign name and base
|
|
31
|
+
brief for A. The tool creates A first, duplicates A into B, applies the B delta,
|
|
32
|
+
and stops for review. The goal is two review-copy campaigns, not a launched
|
|
30
33
|
campaign.
|
|
31
34
|
|
|
32
35
|
## Required Flow
|
|
33
36
|
|
|
34
|
-
1.
|
|
37
|
+
1. Decide the source mode:
|
|
38
|
+
- Existing campaign mode: confirm the source campaign ID or resolve it with
|
|
39
|
+
`get_campaign`.
|
|
40
|
+
- Idea-first mode: write a proper campaign name and base campaign brief from
|
|
41
|
+
the user's idea. If the user also has leads, confirm the clean source
|
|
42
|
+
lead-list ID or use `load_csv_linkedin_leads` first.
|
|
35
43
|
2. Confirm the A/B variable in plain language. Keep variant B as the explicit
|
|
36
44
|
change and leave variant A as the control unless the user names an A change.
|
|
37
|
-
3.
|
|
38
|
-
lead-list table, not the generated campaign workflow
|
|
45
|
+
3. If a source lead list is supplied, verify it is clean. A clean source list is
|
|
46
|
+
a lead-list or signal-lead-list table, not the generated campaign workflow
|
|
47
|
+
table.
|
|
39
48
|
4. Call `prepare_campaign_ab_test` with `dryRun: true` first.
|
|
40
49
|
5. Review split counts, duplicate/skipped counts, campaign names, and variant
|
|
41
50
|
brief deltas with the user.
|
|
@@ -44,6 +53,18 @@ campaign.
|
|
|
44
53
|
7. Return the A and B campaign IDs, split lead-list IDs, counts, and the
|
|
45
54
|
explicit note that both campaigns are `not_started`.
|
|
46
55
|
|
|
56
|
+
## Tool Inputs
|
|
57
|
+
|
|
58
|
+
Use one of these shapes:
|
|
59
|
+
|
|
60
|
+
- Existing campaign mode: pass `sourceCampaignId`, `variantName`,
|
|
61
|
+
`variantBriefDelta`, and any optional split or A-variant fields.
|
|
62
|
+
- Idea-first mode: omit `sourceCampaignId`, pass `campaignName`,
|
|
63
|
+
`campaignBrief`, `variantName`, and `variantBriefDelta`. If a clean lead list
|
|
64
|
+
is available, also pass `sourceLeadListId`; otherwise leave it out. The tool
|
|
65
|
+
creates the A campaign, then duplicates A to create B and applies the B brief
|
|
66
|
+
delta.
|
|
67
|
+
|
|
47
68
|
## Anti-Patterns
|
|
48
69
|
|
|
49
70
|
- Do not call `export_table_csv` from an enriched/generated campaign workflow
|
|
@@ -60,18 +81,19 @@ campaign.
|
|
|
60
81
|
If the source campaign has no clean source lead list, or the source list is
|
|
61
82
|
polluted with workflow/output columns, ask for the original CSV or clean source
|
|
62
83
|
list. Use `load_csv_linkedin_leads`; it strips Sellable workflow columns if a
|
|
63
|
-
contaminated CSV is supplied, then creates a clean lead list.
|
|
64
|
-
|
|
84
|
+
contaminated CSV is supplied, then creates a clean lead list. If no clean source
|
|
85
|
+
is available, continue in idea-first mode without `sourceLeadListId`.
|
|
65
86
|
|
|
66
87
|
## Output Contract
|
|
67
88
|
|
|
68
89
|
Report:
|
|
69
90
|
|
|
70
|
-
- source campaign ID
|
|
71
|
-
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
-
|
|
75
|
-
-
|
|
91
|
+
- source campaign ID, or note that the A campaign was created as the source
|
|
92
|
+
campaign when no source campaign was provided
|
|
93
|
+
- source lead-list ID when supplied
|
|
94
|
+
- split strategy and counts when a source lead list was supplied
|
|
95
|
+
- duplicate/skipped lead counts when a source lead list was supplied
|
|
96
|
+
- A review campaign ID and split lead-list ID when supplied
|
|
97
|
+
- B review campaign ID and split lead-list ID when supplied
|
|
76
98
|
- variant difference
|
|
77
99
|
- `launchState: not_started` for both campaigns
|