@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: string;
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 using its clean source lead list. Creates deterministic A/B split lead lists and review-copy campaigns, updates the variant brief, and never launches either 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: "Existing source campaign ID.",
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: ["sourceCampaignId", "variantName", "variantBriefDelta"],
77
+ required: ["variantName", "variantBriefDelta"],
53
78
  additionalProperties: false,
54
79
  },
55
80
  },
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.276",
3
+ "version": "0.1.277",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -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 source campaign, the one variable being tested, and
28
- the clean source lead origin. Then prepare the split and stop for review. The
29
- goal is two review-copy campaigns with clean split source lists, not a launched
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. Confirm the source campaign ID or resolve it with `get_campaign`.
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. Verify the campaign has a clean source lead list. A clean source list is a
38
- lead-list table, not the generated campaign workflow table.
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. After the clean
64
- source is confirmed, retry `prepare_campaign_ab_test`.
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
- - source lead-list ID
72
- - split strategy and counts
73
- - duplicate/skipped lead counts
74
- - A review campaign ID and split lead-list ID
75
- - B review campaign ID and split lead-list ID
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
@@ -1,9 +0,0 @@
1
- {
2
- "parallelMode": "wide",
3
- "agentCount": 6,
4
- "maxToolCallsPerAgent": 2,
5
- "senderMaxAgents": 2,
6
- "senderMaxToolCallsPerAgent": 3,
7
- "progressMode": true,
8
- "debugMode": true
9
- }