@sellable/mcp 0.1.276 → 0.1.278

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,6 @@
1
1
  export interface PrepareCampaignAbTestInput {
2
2
  sourceCampaignId: string;
3
+ sourceLeadListId?: string;
3
4
  variantName: string;
4
5
  variantBriefDelta: string;
5
6
  variantALabel?: string;
@@ -22,6 +23,10 @@ export declare const campaignAbTestToolDefinitions: {
22
23
  type: string;
23
24
  description: string;
24
25
  };
26
+ sourceLeadListId: {
27
+ type: string;
28
+ description: string;
29
+ };
25
30
  variantName: {
26
31
  type: string;
27
32
  description: string;
@@ -2,13 +2,17 @@ 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 a full Campaign A created through the Sellable create-campaign workflow. The helper duplicates the source campaign through the product duplicate path so B preserves the approved brief, ICP filters, message setup, and campaign-table structure before applying the B delta. sourceLeadListId is optional and must only be supplied after asking whether to split Campaign A's clean selected lead list. 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: "Required Campaign A ID. Create Campaign A through the full Sellable create-campaign workflow before calling this helper.",
12
+ },
13
+ sourceLeadListId: {
14
+ type: "string",
15
+ description: "Optional clean source lead-list table ID from Campaign A. Only pass this after the user approves splitting Campaign A's lead list; when supplied, rows are split into A/B lead lists and imported into review-copy campaigns.",
12
16
  },
13
17
  variantName: {
14
18
  type: "string",
@@ -1210,6 +1210,10 @@ export declare const allTools: ({
1210
1210
  type: string;
1211
1211
  description: string;
1212
1212
  };
1213
+ sourceLeadListId: {
1214
+ type: string;
1215
+ description: string;
1216
+ };
1213
1217
  variantName: {
1214
1218
  type: string;
1215
1219
  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.278",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -1,14 +1,24 @@
1
1
  ---
2
2
  name: create-ab-test
3
- description: Create a Sellable campaign A/B test from a clean source lead list.
3
+ description: Create a Sellable campaign A/B test by duplicating a full Campaign A.
4
4
  visibility: public
5
5
  allowed-tools:
6
6
  - mcp__sellable__get_auth_status
7
+ - mcp__sellable__bootstrap_create_campaign
8
+ - mcp__sellable__get_subskill_prompt
9
+ - mcp__sellable__get_subskill_asset
7
10
  - mcp__sellable__get_active_workspace
11
+ - mcp__sellable__fetch_linkedin_profile
12
+ - mcp__sellable__complete_sender_research
13
+ - mcp__sellable__create_campaign
14
+ - mcp__sellable__update_campaign_brief
15
+ - mcp__sellable__update_campaign
16
+ - mcp__sellable__save_rubrics
8
17
  - mcp__sellable__get_campaign
9
18
  - mcp__sellable__get_campaign_context
10
19
  - mcp__sellable__get_campaign_navigation_state
11
20
  - mcp__sellable__get_campaign_messages_preview
21
+ - mcp__sellable__duplicate_campaign
12
22
  - mcp__sellable__prepare_campaign_ab_test
13
23
  - mcp__sellable__load_csv_linkedin_leads
14
24
  - mcp__sellable__wait_for_lead_list_ready
@@ -24,25 +34,65 @@ campaign-message approaches from the same source list.
24
34
 
25
35
  ## Opening Contract
26
36
 
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
30
- campaign.
37
+ Start by identifying the campaign idea and the one variable being tested.
38
+ Campaign A must be a real, fully prepared Sellable campaign before this A/B
39
+ helper runs. If the user only supplied an idea, first run the normal
40
+ `$sellable:create-campaign` flow for Campaign A: research the sender/company,
41
+ create the campaign shell, build and approve the campaign brief, source or
42
+ attach leads when appropriate, save any approved ICP filters, and get the
43
+ message/template state into the campaign brief. Do not call
44
+ `prepare_campaign_ab_test` with only `campaignName`/`campaignBrief`.
45
+
46
+ Once Campaign A exists, the A/B step duplicates Campaign A through Sellable's
47
+ product duplicate path and applies only the B variant delta. This preserves the
48
+ approved brief, ICP filters, message setup, rubrics, and campaign-table
49
+ structure so the test differs only by the chosen variable and, if approved, the
50
+ split lead list.
31
51
 
32
52
  ## Required Flow
33
53
 
34
- 1. Confirm the source campaign ID or resolve it with `get_campaign`.
54
+ 1. Decide the source mode:
55
+ - Existing Campaign A: confirm the source campaign ID or resolve it with
56
+ `get_campaign`.
57
+ - Idea-only request: run the full `$sellable:create-campaign` workflow first,
58
+ then use the created campaign ID as `sourceCampaignId`.
35
59
  2. Confirm the A/B variable in plain language. Keep variant B as the explicit
36
60
  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.
39
- 4. Call `prepare_campaign_ab_test` with `dryRun: true` first.
40
- 5. Review split counts, duplicate/skipped counts, campaign names, and variant
41
- brief deltas with the user.
42
- 6. Only after review, call `prepare_campaign_ab_test` without `dryRun` using the
61
+ 3. Inspect Campaign A with `get_campaign` and `get_campaign_context`. Confirm
62
+ the brief exists and includes the approved messaging/template state when the
63
+ campaign has reached message review.
64
+ 4. If Campaign A has a clean `selectedLeadListId`, ask the user whether to split
65
+ Campaign A's lead list for this A/B test:
66
+ - Split the lead list: pass that clean list as `sourceLeadListId`.
67
+ - Do not split yet: omit `sourceLeadListId`; Campaign B is a duplicate for
68
+ review and no rows are imported.
69
+ Never silently split a list just because Campaign A has one.
70
+ 5. If a source lead list is supplied, verify it is clean. A clean source list is
71
+ a lead-list or signal-lead-list table, not the generated campaign workflow
72
+ table.
73
+ 6. Call `prepare_campaign_ab_test` with `dryRun: true` first.
74
+ 7. Review split counts when applicable, campaign names, and variant brief deltas
75
+ with the user.
76
+ 8. Only after review, call `prepare_campaign_ab_test` without `dryRun` using the
43
77
  same `idempotencyKey` if one was returned or supplied.
44
- 7. Return the A and B campaign IDs, split lead-list IDs, counts, and the
45
- explicit note that both campaigns are `not_started`.
78
+ 9. Return Campaign A, duplicated Campaign B, split lead-list IDs when supplied,
79
+ counts, and the explicit note that both campaigns are `not_started`.
80
+
81
+ ## Tool Inputs
82
+
83
+ Use one of these shapes:
84
+
85
+ - No split: pass `sourceCampaignId`, `variantName`, `variantBriefDelta`, and
86
+ any optional A-variant fields. The helper treats the source campaign as A and
87
+ duplicates it for B.
88
+ - Approved split: pass `sourceCampaignId`, the approved clean
89
+ `sourceLeadListId`, `variantName`, `variantBriefDelta`, and any optional split
90
+ or A-variant fields. The helper creates deterministic A/B split lead lists and
91
+ review-copy campaigns from Campaign A.
92
+
93
+ Do not pass `campaignName`, `campaignBrief`, `offerPositioning`,
94
+ `clientProspectId`, or `senderLinkedinUrl` to `prepare_campaign_ab_test`.
95
+ Those belong to the full create-campaign workflow that creates Campaign A.
46
96
 
47
97
  ## Anti-Patterns
48
98
 
@@ -60,18 +110,19 @@ campaign.
60
110
  If the source campaign has no clean source lead list, or the source list is
61
111
  polluted with workflow/output columns, ask for the original CSV or clean source
62
112
  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`.
113
+ contaminated CSV is supplied, then creates a clean lead list. If no clean source
114
+ is available, omit `sourceLeadListId` and create only the B duplicate for review.
65
115
 
66
116
  ## Output Contract
67
117
 
68
118
  Report:
69
119
 
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
120
+ - source Campaign A ID
121
+ - source lead-list ID when supplied
122
+ - split strategy and counts when a source lead list was supplied
123
+ - duplicate/skipped lead counts when a source lead list was supplied
124
+ - Campaign A ID, or A review-copy campaign ID when a split was approved
125
+ - duplicated Campaign B ID
126
+ - split lead-list IDs when supplied
76
127
  - variant difference
77
128
  - `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
- }