@sellable/mcp 0.1.322 → 0.1.323

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.
@@ -137,7 +137,7 @@ export interface PostFindLeadsScoutRegistryResponse {
137
137
  }
138
138
  export declare const DEFAULT_SUBSKILL_PROMPT_CHUNK_CHARS = 48000;
139
139
  export declare const MAX_SUBSKILL_PROMPT_CHUNK_CHARS = 48000;
140
- export declare const ALLOWED_SUBSKILL_PROMPT_NAMES: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "fill-send-horizon", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "refresh-sender-engagement", "research", "research-prospect", "research-sender", "weekly-campaign-summary", "workflow-sequences"];
140
+ export declare const ALLOWED_SUBSKILL_PROMPT_NAMES: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-evergreen-campaigns", "create-post", "create-rubric", "engage", "enrich-prospects", "fill-send-horizon", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "refresh-sender-engagement", "research", "research-prospect", "research-sender", "weekly-campaign-summary", "workflow-sequences"];
141
141
  export declare const promptToolDefinitions: ({
142
142
  name: string;
143
143
  description: string;
@@ -181,7 +181,7 @@ export declare const promptToolDefinitions: ({
181
181
  properties: {
182
182
  subskillName: {
183
183
  type: string;
184
- enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "fill-send-horizon", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "refresh-sender-engagement", "research", "research-prospect", "research-sender", "weekly-campaign-summary", "workflow-sequences"];
184
+ enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-evergreen-campaigns", "create-post", "create-rubric", "engage", "enrich-prospects", "fill-send-horizon", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "refresh-sender-engagement", "research", "research-prospect", "research-sender", "weekly-campaign-summary", "workflow-sequences"];
185
185
  description: string;
186
186
  };
187
187
  offset: {
@@ -216,7 +216,7 @@ export declare const promptToolDefinitions: ({
216
216
  properties: {
217
217
  subskillName: {
218
218
  type: string;
219
- enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "fill-send-horizon", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "refresh-sender-engagement", "research", "research-prospect", "research-sender", "weekly-campaign-summary", "workflow-sequences"];
219
+ enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-evergreen-campaigns", "create-post", "create-rubric", "engage", "enrich-prospects", "fill-send-horizon", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "refresh-sender-engagement", "research", "research-prospect", "research-sender", "weekly-campaign-summary", "workflow-sequences"];
220
220
  description: string;
221
221
  };
222
222
  assetPath: {
@@ -25,6 +25,7 @@ export const ALLOWED_SUBSKILL_PROMPT_NAMES = [
25
25
  "create-campaign-v2",
26
26
  "create-campaign-v2-tail",
27
27
  "create-campaign-v2-validation",
28
+ "create-evergreen-campaigns",
28
29
  "create-post",
29
30
  "create-rubric",
30
31
  "engage",
@@ -236,7 +236,7 @@ export declare const allTools: ({
236
236
  properties: {
237
237
  subskillName: {
238
238
  type: string;
239
- enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "fill-send-horizon", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "refresh-sender-engagement", "research", "research-prospect", "research-sender", "weekly-campaign-summary", "workflow-sequences"];
239
+ enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-evergreen-campaigns", "create-post", "create-rubric", "engage", "enrich-prospects", "fill-send-horizon", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "refresh-sender-engagement", "research", "research-prospect", "research-sender", "weekly-campaign-summary", "workflow-sequences"];
240
240
  description: string;
241
241
  };
242
242
  offset: {
@@ -271,7 +271,7 @@ export declare const allTools: ({
271
271
  properties: {
272
272
  subskillName: {
273
273
  type: string;
274
- enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "fill-send-horizon", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "refresh-sender-engagement", "research", "research-prospect", "research-sender", "weekly-campaign-summary", "workflow-sequences"];
274
+ enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-evergreen-campaigns", "create-post", "create-rubric", "engage", "enrich-prospects", "fill-send-horizon", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "refresh-sender-engagement", "research", "research-prospect", "research-sender", "weekly-campaign-summary", "workflow-sequences"];
275
275
  description: string;
276
276
  };
277
277
  assetPath: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.322",
3
+ "version": "0.1.323",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -0,0 +1,59 @@
1
+ ---
2
+ name: create-evergreen-campaigns
3
+ description: Reconcile a sender team's evergreen campaign structure — create-or-reuse the standing campaigns (per-sender post engagers + shared fallback lanes) idempotently, with sequences attached and prospect-safe message briefs. Never duplicates, never launches. Schedule-automation friendly ("make sure evergreen campaigns exist for these users").
4
+ visibility: internal
5
+ ---
6
+
7
+ # Create Evergreen Campaigns
8
+
9
+ <role>
10
+ You are a campaign structure reconciler. Evergreen campaigns are the standing
11
+ always-on lanes every sender should have. Your job is to make reality match the
12
+ plan — creating only what is missing, reusing everything that exists, and never
13
+ producing duplicates. Reconcile/create-reuse only; this skill never launches campaigns.
14
+ </role>
15
+
16
+ <inputs>
17
+ The invoking prompt names the senders ("create evergreen campaigns for csreyes92 and thomas"). Resolve each via `list_senders`.
18
+
19
+ Default evergreen plan per workspace (override only if the prompt specifies different lanes):
20
+
21
+ 1. **`<Sender Name> - Post Engagers`** — one per sender (warm lane, highest priority)
22
+ 2. **`<Workspace/Team> - Shared Signal Discovery`** — one shared across senders
23
+ 3. **`<Workspace/Team> - Shared Cold Fallback`** — one shared across senders
24
+ </inputs>
25
+
26
+ <objective>
27
+ 1. **Inventory first**: `get_campaigns` + `list_tables` in the active workspace. Match existing campaigns to the plan by name (case-insensitive, ignore suffixes like "(Copy)"). A matching non-archived campaign = REUSE; record it and move on. Never create a second campaign for a slot that already has one.
28
+ 2. **Create only the missing slots** with `create_on_demand_campaign({ name, senderIds, campaignBrief })`:
29
+ - Post Engagers lanes: that sender's ID only. Shared lanes: all the senders' IDs.
30
+ - The brief must include the warm post-engager first-message template style — short, casual, references the post they engaged with, closed question, **no internal vocabulary, no pitch, no meeting ask** in message one:
31
+
32
+ ```
33
+ {{first_name}}
34
+
35
+ Hey there
36
+
37
+ Saw you pop up on my post about {{post_topic_line}}
38
+ ```
39
+
40
+ - The sequence is auto-selected by sender tier; do not hand-author sequence templates here. Never select a paid-InMail template.
41
+ 3. **Verify each slot** after create/reuse: `get_campaign` shows the table exists and a sequence is attached (`list_tables({ hasSequence: true })` as a cross-check).
42
+ 4. **Report the reconcile plan and result** — every slot tagged `reused` or `created`, nothing else:
43
+
44
+ ```
45
+ Evergreen Reconcile — {date}
46
+ • Christian Reyes - Post Engagers: reused (18 rows)
47
+ • Thomas Nobbs - Post Engagers: reused (8 rows)
48
+ • Sellable.dev - Shared Signal Discovery: reused
49
+ • Sellable.dev - Shared Cold Fallback: created (empty — needs leads)
50
+ All campaigns remain unlaunched. Next: refresh-sender-engagement to supply the warm lanes, then fill-send-horizon.
51
+ ```
52
+ </objective>
53
+
54
+ <safety>
55
+ - **Idempotent by construction**: rerunning on a schedule must produce all-`reused` and zero new campaigns. If a name matches ambiguously (two candidates), reuse the most recently updated and flag the duplicate for the operator instead of creating a third.
56
+ - Never call `start_campaign` / `start_on_demand_campaign`. New campaigns stay in their default unlaunched state.
57
+ - Never archive, rename, or delete existing campaigns — reconcile is additive; structural removals are operator actions.
58
+ - Respect workspace boundaries: senders and campaigns must belong to the active workspace.
59
+ </safety>
@@ -17,7 +17,7 @@ The invoking prompt (often a scheduled automation) names the targets. Accept any
17
17
  - Sender names ("…for csreyes92 and thomas") — resolve via `list_senders`, then `get_campaigns` and match campaigns attached to those senders
18
18
  - Nothing specific ("fill send horizon") — operate on all non-archived campaign tables in the active workspace that have a sequence attached (`list_tables({ hasSequence: true })`), skipping ARCHIVED ones
19
19
 
20
- Optional inputs: `targetPreparedMessages` (default: leave unset for the adaptive default), and an explicit "approve" instruction (see safety rules).
20
+ Optional inputs: `targetPreparedMessages` (default: leave unset for the adaptive default), an explicit "approve" instruction (see safety rules), and a **waterfall priority order** (see below).
21
21
  </inputs>
22
22
 
23
23
  <objective>
@@ -30,6 +30,24 @@ For each target campaign:
30
30
  5. Report per campaign: prepared count, approved count, what is staged for the horizon, and the single next operator action (usually "approve messages in the UI").
31
31
  </objective>
32
32
 
33
+ <waterfall>
34
+ ## Campaign hierarchy (waterfall order)
35
+
36
+ When the invoking prompt gives an ordered list — or when a sender has the standard evergreen lanes — fill in **priority order** and only fall through when a lane runs dry:
37
+
38
+ 1. **Default order per sender**: `<Sender> - Post Engagers` (warmest) → `Shared Signal Discovery` → `Shared Cold Fallback` (coldest). The invoking prompt can override with any explicit order ("fill in this order: A, B, C").
39
+ 2. **Fill the top lane first.** Move to the next lane ONLY when the current one stops with source exhaustion / no more eligible rows — never because it is merely slow.
40
+ 3. **Stop descending once the horizon target is met.** If the warm lane alone fills the horizon, the cold lanes get nothing this run — that is correct, not a gap.
41
+ 4. **Report per lane** so the operator can see the waterfall working:
42
+
43
+ ```
44
+ csreyes92 waterfall: Post Engagers filled 4/4 (horizon met — lower lanes skipped)
45
+ thomas waterfall: Post Engagers 1/4 (source thin) → Shared Signal Discovery 3/3 remaining
46
+ ```
47
+
48
+ To **change the hierarchy**, the scheduled automation just states the new order in its prompt — the order is an input to this skill, not stored state.
49
+ </waterfall>
50
+
33
51
  <safety>
34
52
  - **Never call `start_campaign`, `start_on_demand_campaign`, or `start_direct_campaign`.** Activating a campaign is always an explicit human action outside this skill.
35
53
  - Use `approvalMode: "approve"` ONLY when the invoking prompt explicitly says to auto-approve (e.g. "fill and approve"). Default is `mark_ready` — a human approves in the UI.