@sellable/mcp 0.1.362 → 0.1.363
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/api.d.ts +7 -0
- package/dist/api.js +32 -0
- package/dist/index-dev.js +0 -0
- package/dist/index.js +0 -0
- package/dist/server.js +4 -31
- package/dist/tools/cells.js +2 -2
- package/dist/tools/prompts.js +1 -1
- package/dist/tools/registry.js +2 -2
- package/dist/tools/rows.js +1 -1
- package/dist/tools/workspace-export.d.ts +82 -0
- package/dist/tools/workspace-export.js +328 -0
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +0 -8
- package/skills/create-campaign-v2/references/final-handoff-contract.md +1 -14
- package/skills/create-campaign-v2-tail/SKILL.md +1 -16
- package/skills/create-evergreen-campaigns/SKILL.md +11 -427
- package/skills/refill-sends/SKILL.md +0 -8
- package/skills/refill-sends-workflow/SKILL.md +0 -61
- package/dist/tools/setup-evergreen-campaigns.d.ts +0 -113
- package/dist/tools/setup-evergreen-campaigns.js +0 -100
|
@@ -7,9 +7,6 @@ allowed-tools:
|
|
|
7
7
|
- mcp__sellable__get_campaign_refill_state
|
|
8
8
|
- mcp__sellable__fill_campaign_horizon
|
|
9
9
|
- mcp__sellable__get_campaign
|
|
10
|
-
- mcp__sellable__get_campaign_context
|
|
11
|
-
- mcp__sellable__update_campaign
|
|
12
|
-
- mcp__sellable__get_provider_prompt
|
|
13
10
|
- mcp__sellable__get_campaign_message_preparation_status
|
|
14
11
|
- mcp__sellable__start_campaign_message_preparation
|
|
15
12
|
- mcp__sellable__cancel_campaign_message_preparation
|
|
@@ -17,7 +14,6 @@ allowed-tools:
|
|
|
17
14
|
- mcp__sellable__wait_for_lead_list_ready
|
|
18
15
|
- mcp__sellable__confirm_lead_list
|
|
19
16
|
- mcp__sellable__search_signals
|
|
20
|
-
- mcp__sellable__select_promising_posts
|
|
21
17
|
- mcp__sellable__fetch_post_engagers
|
|
22
18
|
- mcp__sellable__search_sales_nav
|
|
23
19
|
- mcp__sellable__lookup_sales_nav_filter
|
|
@@ -31,10 +27,6 @@ allowed-tools:
|
|
|
31
27
|
- mcp__sellable__get_rows
|
|
32
28
|
- mcp__sellable__get_rows_minimal
|
|
33
29
|
- mcp__sellable__get_table_rows
|
|
34
|
-
- mcp__sellable__get_campaign_table_schema
|
|
35
|
-
- mcp__sellable__select_campaign_cells
|
|
36
|
-
- mcp__sellable__wait_for_campaign_processing
|
|
37
|
-
- mcp__sellable__get_sender
|
|
38
30
|
---
|
|
39
31
|
|
|
40
32
|
# Refill Sends Workflow
|
|
@@ -109,42 +101,6 @@ Source replenishment choices:
|
|
|
109
101
|
source prospects into the same campaign/source-list path, then confirm
|
|
110
102
|
readiness.
|
|
111
103
|
|
|
112
|
-
### Running Campaign Signal Discovery Recovery
|
|
113
|
-
|
|
114
|
-
For an already-running regular campaign that needs same-campaign Signal
|
|
115
|
-
Discovery replenishment, treat the watch/current-step transition as a guarded
|
|
116
|
-
repair, not as normal create-campaign navigation.
|
|
117
|
-
|
|
118
|
-
Do not call `search_signals` with `currentStep:"signal-discovery"` directly from `currentStep:"running"`. The campaign step guard intentionally rejects that
|
|
119
|
-
backwards transition. After exact approval and a fresh refill-state reread, clear `currentStep` only if it still exactly matches `running`:
|
|
120
|
-
|
|
121
|
-
```text
|
|
122
|
-
update_campaign({ campaignId, currentStep:null, clearCurrentStepIfMatches:"running" })
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
Then register provider preflight and run a campaign-scoped `search_signals` so
|
|
126
|
-
post rows exist in the campaign's Signal Discovery state:
|
|
127
|
-
|
|
128
|
-
```text
|
|
129
|
-
get_provider_prompt({ provider:"signal-discovery", campaignOfferId, confirmed:true })
|
|
130
|
-
search_signals({ campaignOfferId, currentStep:"signal-discovery", confirmed:true, ... })
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
Use `select_promising_posts` before importing. For a fresh source refill, prefer
|
|
134
|
-
`selectionMode:"replace"` and `scrapePlanMode:"capacity-target"` with the
|
|
135
|
-
approved `targetEngagerCount` and `maxPostsToScrape`. If the approved post set cannot cover the target, do not knowingly run an under-capacity scrape; ask for approval to expand the selected post set or switch source.
|
|
136
|
-
|
|
137
|
-
If `import_leads` returns `reusedExistingSourceList` but the user explicitly
|
|
138
|
-
approved a different selected-post scrape, retry `import_leads` with the existing `sourceLeadListId` from that response or from refill state. For Signal
|
|
139
|
-
Discovery this bypasses the stale reuse guard and materializes the newly
|
|
140
|
-
selected campaign-scoped posts into a fresh source list.
|
|
141
|
-
|
|
142
|
-
After `wait_for_lead_list_ready`, call `confirm_lead_list` with the new
|
|
143
|
-
source-list id and same campaign id. Pass `currentStep:"running"` to `confirm_lead_list` for an ACTIVE already-running campaign so the watched state
|
|
144
|
-
returns to Running after same-campaign source rows are copied. Do not call
|
|
145
|
-
`update_campaign` to fake this after the copy; `confirm_lead_list` owns the
|
|
146
|
-
post-copy state transition.
|
|
147
|
-
|
|
148
104
|
Before any source mutation, show exact approval evidence: workspace id,
|
|
149
105
|
campaign id, workflow table id, source/provider id, source-list id when known,
|
|
150
106
|
import caps, target dates/caps, dedupe/DNC/provider exclusion expectations, and
|
|
@@ -179,28 +135,11 @@ Before prep or approval mutation, reread `get_campaign_refill_state` and compare
|
|
|
179
135
|
If they changed, stop. A second concurrent refill run must see the first run's
|
|
180
136
|
import/prep state on reread and avoid duplicate work.
|
|
181
137
|
|
|
182
|
-
After same-campaign source copy, inspect the actual campaign-table position of
|
|
183
|
-
the copied rows before starting prep. Newly copied rows often land after the first 100 table rows. Use `get_campaign_table_schema` to read the `reviewBatch`,
|
|
184
|
-
then use `select_campaign_cells` diagnostics against
|
|
185
|
-
`rowSelector:{ type:"reviewBatch" }` for `enrich`, `generateMessage`, and
|
|
186
|
-
`approved` roles when needed.
|
|
187
|
-
|
|
188
|
-
If review-batch enrich cells are pending or Generate Message cells are
|
|
189
|
-
dependency-blocked, omit `maxRowsToCheck` so the adaptive prep job can cover the
|
|
190
|
-
bounded table scan, or set a bounded cap high enough to include appended rows
|
|
191
|
-
when row count evidence requires it. Do not run a fixed `maxRowsToCheck:100` prep pass after appending rows to a larger existing campaign table; it can spend
|
|
192
|
-
the whole budget on older rows and miss the refill batch.
|
|
193
|
-
|
|
194
138
|
Scheduled success requires a post-action reread proving scheduler-owned cells
|
|
195
139
|
with non-null `scheduledFor`. Prepared, approved, and ready-to-schedule rows are
|
|
196
140
|
intermediate states; report them as awaiting scheduler unless scheduled cells
|
|
197
141
|
are present.
|
|
198
142
|
|
|
199
|
-
preparedMessages can remain 0 while scheduler-ready state changes downstream.
|
|
200
|
-
After a prep job reaches a terminal state, run `wait_for_campaign_processing`
|
|
201
|
-
when generated/pass counts are still settling, then poll `get_campaign_refill_state` until `readyToSchedule` drops, scheduled counts increase, or the state clearly
|
|
202
|
-
remains awaiting scheduler. Do not force scheduler fields directly.
|
|
203
|
-
|
|
204
143
|
## Evergreen Campaign Discipline
|
|
205
144
|
|
|
206
145
|
`fill_campaign_horizon` is a legacy evergreen-only lower-level primitive. Call it
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
type SetupEvergreenCampaignsInput = {
|
|
2
|
-
mode?: "plan" | "verify";
|
|
3
|
-
depth?: "structure_only" | "customer_visible";
|
|
4
|
-
yolo?: boolean;
|
|
5
|
-
allConnectedSenders?: boolean;
|
|
6
|
-
selectedSenderIds?: string[];
|
|
7
|
-
postEngagerSenderIds?: string[];
|
|
8
|
-
sharedSenderIds?: string[];
|
|
9
|
-
bindings?: Array<{
|
|
10
|
-
laneKey: string;
|
|
11
|
-
campaignId: string;
|
|
12
|
-
tableId: string;
|
|
13
|
-
}>;
|
|
14
|
-
planRevision?: string;
|
|
15
|
-
selectedActionIds?: string[];
|
|
16
|
-
receipts?: unknown[];
|
|
17
|
-
};
|
|
18
|
-
export declare const setupEvergreenCampaignsToolDefinitions: {
|
|
19
|
-
name: string;
|
|
20
|
-
description: string;
|
|
21
|
-
inputSchema: {
|
|
22
|
-
type: string;
|
|
23
|
-
properties: {
|
|
24
|
-
mode: {
|
|
25
|
-
type: string;
|
|
26
|
-
enum: string[];
|
|
27
|
-
description: string;
|
|
28
|
-
};
|
|
29
|
-
depth: {
|
|
30
|
-
type: string;
|
|
31
|
-
enum: string[];
|
|
32
|
-
description: string;
|
|
33
|
-
};
|
|
34
|
-
yolo: {
|
|
35
|
-
type: string;
|
|
36
|
-
description: string;
|
|
37
|
-
};
|
|
38
|
-
allConnectedSenders: {
|
|
39
|
-
type: string;
|
|
40
|
-
description: string;
|
|
41
|
-
};
|
|
42
|
-
selectedSenderIds: {
|
|
43
|
-
type: string;
|
|
44
|
-
items: {
|
|
45
|
-
type: string;
|
|
46
|
-
};
|
|
47
|
-
maxItems: number;
|
|
48
|
-
description: string;
|
|
49
|
-
};
|
|
50
|
-
postEngagerSenderIds: {
|
|
51
|
-
type: string;
|
|
52
|
-
items: {
|
|
53
|
-
type: string;
|
|
54
|
-
};
|
|
55
|
-
maxItems: number;
|
|
56
|
-
description: string;
|
|
57
|
-
};
|
|
58
|
-
sharedSenderIds: {
|
|
59
|
-
type: string;
|
|
60
|
-
items: {
|
|
61
|
-
type: string;
|
|
62
|
-
};
|
|
63
|
-
maxItems: number;
|
|
64
|
-
description: string;
|
|
65
|
-
};
|
|
66
|
-
bindings: {
|
|
67
|
-
type: string;
|
|
68
|
-
maxItems: number;
|
|
69
|
-
items: {
|
|
70
|
-
type: string;
|
|
71
|
-
properties: {
|
|
72
|
-
laneKey: {
|
|
73
|
-
type: string;
|
|
74
|
-
};
|
|
75
|
-
campaignId: {
|
|
76
|
-
type: string;
|
|
77
|
-
};
|
|
78
|
-
tableId: {
|
|
79
|
-
type: string;
|
|
80
|
-
};
|
|
81
|
-
};
|
|
82
|
-
required: string[];
|
|
83
|
-
additionalProperties: boolean;
|
|
84
|
-
};
|
|
85
|
-
description: string;
|
|
86
|
-
};
|
|
87
|
-
planRevision: {
|
|
88
|
-
type: string;
|
|
89
|
-
description: string;
|
|
90
|
-
};
|
|
91
|
-
selectedActionIds: {
|
|
92
|
-
type: string;
|
|
93
|
-
items: {
|
|
94
|
-
type: string;
|
|
95
|
-
};
|
|
96
|
-
maxItems: number;
|
|
97
|
-
description: string;
|
|
98
|
-
};
|
|
99
|
-
receipts: {
|
|
100
|
-
type: string;
|
|
101
|
-
maxItems: number;
|
|
102
|
-
items: {
|
|
103
|
-
type: string;
|
|
104
|
-
};
|
|
105
|
-
description: string;
|
|
106
|
-
};
|
|
107
|
-
};
|
|
108
|
-
required: never[];
|
|
109
|
-
additionalProperties: boolean;
|
|
110
|
-
};
|
|
111
|
-
}[];
|
|
112
|
-
export declare function setupEvergreenCampaigns(input: SetupEvergreenCampaignsInput): Promise<unknown>;
|
|
113
|
-
export {};
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { getApi } from "../api.js";
|
|
2
|
-
async function postSetupEvergreenCampaigns(body) {
|
|
3
|
-
const api = getApi();
|
|
4
|
-
return api.post("/api/v3/mcp/setup-evergreen-campaigns", body);
|
|
5
|
-
}
|
|
6
|
-
export const setupEvergreenCampaignsToolDefinitions = [
|
|
7
|
-
{
|
|
8
|
-
name: "setup_evergreen_campaigns",
|
|
9
|
-
description: "Evergreen campaign setup plan/verify command. Use plan mode first to inspect exact workspace/sender/campaign/table/source state and receive immutable lane packets. `selectedSenderIds` is a legacy shorthand for both scopes; prefer `postEngagerSenderIds` for the Post Engagers sender scope and `sharedSenderIds` for the shared lane sender scope when they differ. The command plans one Post Engagers lane per post-engager sender plus shared Signal Discovery and Shared Cold Fallback lanes for the shared sender set. yolo is only a parent-skill auto-execution hint for safe lane packets; this backend command remains read-only in plan mode and verifies receipts in verify mode. When safe-yolo needs normal setup work, the parent skill may ask for bounded delegated approval: one approval over the current planRevision, selected action ids, caps, allowed side-effect classes, and stop conditions lets lane workers execute without per-substep approval while staying inside that packet. Lane workers must execute creation, source import, create-campaign workflow steps, generate-messages, sequence attachment, pause_campaign review-state transition when the current table is still DRAFT, and review readiness through existing create-campaign workflow/subskills, then return receipts here for verification. Customer-visible verify receipts must include createCampaignStepReceipt with setupPlanCall, campaignBriefReceipt, sourceDecisionReceipt, filterDecisionReceipt, messageDraftingReceipt, reviewBatchReceipt, sequenceReceipt, and verifyCall. messageDraftingReceipt must use statusSource:'branch' or statusSource:'packaged-generate-messages-worker' and include proof that generate-messages was loaded, start_campaign_message_preparation/get_campaign_message_preparation_status ran when the packaged worker path is used, validationResult:'passed', a passed qualityReview, and at least 3 concrete sampleMessages with row ids, generated message text, pass verdicts, and no issues; Shared Cold Fallback samples with a standalone name followed by 'Hey there' are rejected. This command does not launch campaigns, does not schedule sends, does not assign scheduler-owned send fields, does not raw-write campaign status, does not archive/delete cleanup targets, and does not spend paid credits.",
|
|
10
|
-
inputSchema: {
|
|
11
|
-
type: "object",
|
|
12
|
-
properties: {
|
|
13
|
-
mode: {
|
|
14
|
-
type: "string",
|
|
15
|
-
enum: ["plan", "verify"],
|
|
16
|
-
description: 'Defaults to "plan". Verify only validates worker receipts.',
|
|
17
|
-
},
|
|
18
|
-
depth: {
|
|
19
|
-
type: "string",
|
|
20
|
-
enum: ["structure_only", "customer_visible"],
|
|
21
|
-
description: 'Use "customer_visible" for full setup proof or "structure_only" when only ensuring lane shells/config.',
|
|
22
|
-
},
|
|
23
|
-
yolo: {
|
|
24
|
-
type: "boolean",
|
|
25
|
-
description: "plan mode only. Requests auto-executable lane packets when state is safe; never authorizes cleanup, launch, scheduling, sending, or ambiguous target choice.",
|
|
26
|
-
},
|
|
27
|
-
allConnectedSenders: {
|
|
28
|
-
type: "boolean",
|
|
29
|
-
description: "Plan sender-owned Post Engagers lanes for all eligible connected senders in the active workspace.",
|
|
30
|
-
},
|
|
31
|
-
selectedSenderIds: {
|
|
32
|
-
type: "array",
|
|
33
|
-
items: { type: "string" },
|
|
34
|
-
maxItems: 25,
|
|
35
|
-
description: "Legacy shorthand: exact OutboundSenderIdentity ids for both sender-owned Post Engagers lanes and shared-lane sender set. Prefer scoped fields when those differ.",
|
|
36
|
-
},
|
|
37
|
-
postEngagerSenderIds: {
|
|
38
|
-
type: "array",
|
|
39
|
-
items: { type: "string" },
|
|
40
|
-
maxItems: 25,
|
|
41
|
-
description: "Exact OutboundSenderIdentity ids that should receive sender-owned Post Engagers lanes.",
|
|
42
|
-
},
|
|
43
|
-
sharedSenderIds: {
|
|
44
|
-
type: "array",
|
|
45
|
-
items: { type: "string" },
|
|
46
|
-
maxItems: 25,
|
|
47
|
-
description: "Exact OutboundSenderIdentity ids attached to shared Signal Discovery and Shared Cold Fallback lanes.",
|
|
48
|
-
},
|
|
49
|
-
bindings: {
|
|
50
|
-
type: "array",
|
|
51
|
-
maxItems: 20,
|
|
52
|
-
items: {
|
|
53
|
-
type: "object",
|
|
54
|
-
properties: {
|
|
55
|
-
laneKey: { type: "string" },
|
|
56
|
-
campaignId: { type: "string" },
|
|
57
|
-
tableId: { type: "string" },
|
|
58
|
-
},
|
|
59
|
-
required: ["laneKey", "campaignId", "tableId"],
|
|
60
|
-
additionalProperties: false,
|
|
61
|
-
},
|
|
62
|
-
description: "Exact existing campaign/table bindings to reuse for lane keys. Do not pass names.",
|
|
63
|
-
},
|
|
64
|
-
planRevision: {
|
|
65
|
-
type: "string",
|
|
66
|
-
description: "Required for verify. Copy from the immediately preceding plan.",
|
|
67
|
-
},
|
|
68
|
-
selectedActionIds: {
|
|
69
|
-
type: "array",
|
|
70
|
-
items: { type: "string" },
|
|
71
|
-
maxItems: 20,
|
|
72
|
-
description: "Required for verify. Immutable action ids selected from the current plan.",
|
|
73
|
-
},
|
|
74
|
-
receipts: {
|
|
75
|
-
type: "array",
|
|
76
|
-
maxItems: 20,
|
|
77
|
-
items: { type: "object" },
|
|
78
|
-
description: "Required for verify. Structured lane worker receipts from create-campaign/source/message/sequence execution. Customer-visible lanes must include createCampaignStepReceipt with setupPlanCall, campaignBriefReceipt, sourceDecisionReceipt, filterDecisionReceipt, messageDraftingReceipt, reviewBatchReceipt, sequenceReceipt, and verifyCall.",
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
required: [],
|
|
82
|
-
additionalProperties: false,
|
|
83
|
-
},
|
|
84
|
-
},
|
|
85
|
-
];
|
|
86
|
-
export function setupEvergreenCampaigns(input) {
|
|
87
|
-
return postSetupEvergreenCampaigns({
|
|
88
|
-
mode: input.mode,
|
|
89
|
-
yolo: input.yolo,
|
|
90
|
-
depth: input.depth,
|
|
91
|
-
allConnectedSenders: input.allConnectedSenders,
|
|
92
|
-
selectedSenderIds: input.selectedSenderIds,
|
|
93
|
-
postEngagerSenderIds: input.postEngagerSenderIds,
|
|
94
|
-
sharedSenderIds: input.sharedSenderIds,
|
|
95
|
-
bindings: input.bindings,
|
|
96
|
-
planRevision: input.planRevision,
|
|
97
|
-
selectedActionIds: input.selectedActionIds,
|
|
98
|
-
receipts: input.receipts,
|
|
99
|
-
});
|
|
100
|
-
}
|