@sellable/mcp 0.1.121 → 0.1.123

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.
@@ -26,26 +26,36 @@ Use the inherited Sellable MCP tools when available:
26
26
  Process:
27
27
 
28
28
  1. Read the campaign brief, kickoff doc, or lane prompt supplied by the parent.
29
- 2. Search 3-5 keyword/topic lanes, favoring fresh posts from the last 7-14 days.
29
+ 2. Generate 3-5 intersection keyword/topic lanes, favoring fresh posts from the
30
+ last 7-14 days. Each lane should combine the campaign anchor with the buyer
31
+ pain, use case, or ICP role so fit is high before sampling. For example, for
32
+ a Claude + GTM/outbound campaign, prefer `Claude outbound`, `Claude Code
33
+ LinkedIn outreach`, `AI SDR Claude`, `GTM automation Claude`, and `founder-led
34
+ sales Claude`; do not treat broad anchor-only lanes like `Claude Code`, `MCP`,
35
+ `AI agents`, or `agentic coding` as selectable unless they also include the
36
+ GTM/outbound wedge or the narrower lanes fail.
30
37
  3. Inspect finalist posts by content type before final selection. Prefer posts
31
38
  where the topic matches the campaign wedge, not generic high-engagement news.
32
- 4. Promote the first narrow sample set when campaign-attached. If a
39
+ 4. If Round 1 produced broad anchor-only inventory, retarget immediately around
40
+ the wedge before sampling. Do not promote or sample broad posts when there are
41
+ narrower posts about the actual campaign pain/use case.
42
+ 5. Promote the first narrow sample set when campaign-attached. If a
33
43
  `campaignOfferId` was supplied, call `select_promising_posts({
34
44
  campaignOfferId, selectionMode: "replace", selections, headlineICPCriteria,
35
45
  currentStep: "signal-discovery" })` before sampling so the watched Signal
36
46
  Discovery table shows the exact posts being tested.
37
- 5. Fetch or sample engagers for promoted posts and score rough ICP fit from
47
+ 6. Fetch or sample engagers for promoted posts and score rough ICP fit from
38
48
  visible headline/display-name cues only. Do not enrich people during
39
49
  viability estimation.
40
- 6. Compute capacity before recommending the source: target good-fit leads
50
+ 7. Compute capacity before recommending the source: target good-fit leads
41
51
  (default 500 unless the parent supplies a target), reachable engagers,
42
52
  sampled ICP-fit rate as `n/N` plus an easy percentage/range, expected usable
43
53
  leads per right-content post after dedupe/cleanup, and posts needed to hit
44
54
  the target.
45
- 7. Select/promote enough right-content posts to plausibly hit the target. If the
55
+ 8. Select/promote enough right-content posts to plausibly hit the target. If the
46
56
  warm Signals pool is useful but too small, return the expected warm range and
47
57
  recommend Sales Nav/Prospeo for scale instead of padding with noisy posts.
48
- 8. Return false positives and dead ends explicitly.
58
+ 9. Return false positives and dead ends explicitly.
49
59
 
50
60
  Return a concise structured result with:
51
61
 
@@ -67,6 +77,10 @@ Evidence standards:
67
77
 
68
78
  - Do not trust raw post volume without inspecting finalist post quality.
69
79
  - Prefer sample-based pass rates over intuition.
80
+ - Prefer narrow intersection topics over broad audience topics. A post about
81
+ the anchor technology alone is not enough; the post should also express the
82
+ GTM/outbound/buyer pain, workflow, or role context that makes the campaign
83
+ relevant.
70
84
  - Do not make the user infer capacity. Say, plainly, how many eligible posts
71
85
  exist, what percent of sampled engagers looked in-ICP, how many posts are
72
86
  needed for 500+ good-fit leads, and which posts you would use.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.121",
3
+ "version": "0.1.123",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -433,7 +433,10 @@ brief`, `Revise target`, `Revise offer/proof`, and `Other / custom`.
433
433
  campaign brief. Do not wait for file-write chrome before asking for approval.
434
434
  Before Find Leads, call `update_campaign({ campaignId, campaignBrief,
435
435
  currentStep: "pick-provider", watchNarration: { ... } })` after approval so
436
- the watch link moves out of Plan while the main thread compares source paths.
436
+ the watch link moves out of Plan while the main thread explains the source
437
+ path. This must be a visible Pick Provider checkpoint before the watched
438
+ browser moves into Signal Discovery, Sales Nav, Prospeo, or another provider
439
+ lane.
437
440
 
438
441
  - After the brief is approved, show the next progress line. When the user has
439
442
  not given a specific source direction, use the default sequential source
@@ -444,6 +447,11 @@ that gives the strongest message context if enough ICP-looking people are
444
447
  engaging. If that does not clear a quick viability check, I'll switch to Sales
445
448
  Nav with recent activity, then broader Sales Nav, and use Prospeo only as the
446
449
  fallback. No leads import until you approve the source.`
450
+ The watched campaign should still be on Pick Provider while this source logic
451
+ is being explained. If the default first lane is Signal Discovery, say clearly
452
+ that Codex is about to test Signal Discovery as a viability path, not import
453
+ leads: it will look for relevant posts, sample engagers, estimate ICP fit, and
454
+ only continue if the source math works.
447
455
  - If the user's request already points to a source, do not force the default
448
456
  funnel. Start with the matching lane and say why:
449
457
  - specific posts, creators, topics, comments, or engagement signals ->
@@ -453,8 +461,9 @@ fallback. No leads import until you approve the source.`
453
461
  search, or target accounts -> Prospeo
454
462
  - supplied CSV/profile list -> existing/supplied list preview
455
463
  - explicit compare request -> compare only the requested sources
456
- - In watch mode, do not leave the user sitting on only `pick-provider` while
457
- source viability is checked. Move the campaign to the first source lane that
464
+ - In watch mode, do not skip the Pick Provider checkpoint. First move the
465
+ campaign to `pick-provider` and narrate the source-selection reasoning there.
466
+ After that visible checkpoint, move the campaign to the first source lane that
458
467
  will actually be tested (`signal-discovery`, `sales-nav`, `prospeo`, or the
459
468
  user-directed lane), then run the campaign-attached provider prompt + provider
460
469
  search in the parent thread with `campaignOfferId`, `confirmed: true`, and
@@ -807,8 +816,9 @@ Required behavior:
807
816
  then stop on the first viable source unless the user asked to compare.
808
817
  1. Start with LinkedIn Engagement / active LinkedIn posts (internal provider:
809
818
  Signals / `signal-discovery`) because recent engagement gives the strongest
810
- message context and expected reply-rate upside. Search relevant keyword
811
- lanes, review finalist posts, promote a narrow sample set with
819
+ message context and expected reply-rate upside. Search intersection keyword
820
+ lanes that combine the campaign anchor with the buyer pain/use case/ICP
821
+ role, review finalist posts, promote a narrow sample set with
812
822
  `select_promising_posts` before fetching engagers when a campaign shell
813
823
  exists, fetch top-post engagers, estimate ICP-fit rate, compute posts
814
824
  needed for the target good-fit lead count, and only then recommend the
@@ -859,6 +869,13 @@ Required behavior:
859
869
  keyword lanes; it does not mean 492 prospects. The source decision must name
860
870
  the actual posts we would use, show why they won, and estimate usable engagers
861
871
  from those posts after headline/sample filtering
872
+ - for Signals-first campaigns, keyword lanes must be intersection-first. If the
873
+ campaign anchor is `Claude`, `MCP`, `AI agents`, or another broad technology,
874
+ do not make broad anchor-only lanes the main test. Combine the anchor with the
875
+ specific wedge and buyer pain, such as outbound, GTM automation, LinkedIn
876
+ outreach, AI SDR skepticism, founder-led sales, RevOps, or the ICP role. Treat
877
+ broad anchor-only lanes as fallback inventory only, and retarget before
878
+ sampling if the first pass is broad.
862
879
  - Signals viability is based on estimated ICP-fit reachable engagers, not raw
863
880
  post count and not whether it beats Sales Nav scale. If 5-8 selected posts can
864
881
  plausibly produce ~150+ ICP-fit warm prospects before final filtering, keep
@@ -546,7 +546,9 @@
546
546
  "watchNarration.stage": "find-leads"
547
547
  },
548
548
  "when": "before_sequential_source_funnel",
549
- "chatRenderRule": "Move the campaign watch view to Find Leads before the main thread starts source viability work. If the user did not specify a source, explain the default order: start with warm LinkedIn post engagement because it gives stronger message context and expected reply-rate upside when enough ICP-looking engagers exist; if it is not viable, switch to Sales Nav with recent activity, then broader Sales Nav, and use Prospeo only as the fallback. If the user did specify hiring signals, domains/accounts, supplied lists, posts/comments, or titles/personas, explain that the matching source overrides the default funnel. State that no leads import until a source is approved. The watchNarration headline/body must name the lane being tested, why this lane now, the quick viability gate, and the safety boundary. Do not mention MCP or local artifacts."
549
+ "requiresVisibleCheckpointBeforeProviderLane": true,
550
+ "forbidDirectPlanToProviderLane": true,
551
+ "chatRenderRule": "Move the campaign watch view to the Pick Provider step before the main thread starts source viability work. This must be a distinct visible checkpoint: do not jump directly from Plan to Signal Discovery, Sales Nav, Prospeo, or another provider lane in the same visible beat. While the watched browser is on Pick Provider, explain the source-selection logic. If the user did not specify a source, explain the default order: start with warm LinkedIn post engagement because it gives stronger message context and expected reply-rate upside when enough ICP-looking engagers exist; if it is not viable, switch to Sales Nav with recent activity, then broader Sales Nav, and use Prospeo only as the fallback. If starting with Signal Discovery, explicitly say this is a viability test: Codex will look for relevant posts, sample engagers, estimate ICP fit, and only continue if the source math works. If the user did specify hiring signals, domains/accounts, supplied lists, posts/comments, or titles/personas, explain that the matching source overrides the default funnel. State that no leads import until a source is approved. The watchNarration headline/body must name the first lane being considered, why this lane now, the quick viability gate, and the safety boundary. Do not mention MCP or local artifacts."
550
552
  },
551
553
  {
552
554
  "action": "advance_watch_to_initial_source_lane",
@@ -564,8 +566,9 @@
564
566
  "existingList": "saved-lists",
565
567
  "uploadedDomains": "prospeo"
566
568
  },
567
- "when": "before_first_source_attempt",
568
- "rule": "Choose the first visible source lane from explicit source direction when present, otherwise default to Signal Discovery. Send watchNarration with stage find-leads that says why this lane is being tried now, what quick sample or filter gate will pass/fail it, and why that helps this campaign. For Signal Discovery sampling, promote/select the first narrow sample posts with select_promising_posts before fetch_post_engagers so the watched table shows the exact posts being sampled; the guide copy should say Codex is pulling sample engagers from these posts to confirm the ICP is actually engaging and estimate whether enough right-content posts exist for the target lead count. Before final source approval, compute eligible posts, sampled ICP-fit rate, target good-fit lead count, posts needed, selected posts, expected good-fit range, and scale fallback. If the lane fails, update currentStep and watchNarration before moving to Sales Nav recent activity, normal Sales Nav, or Prospeo."
569
+ "when": "after_source_selection_checkpoint_before_first_source_attempt",
570
+ "requiresPriorVisibleStep": "pick-provider",
571
+ "rule": "Choose the first visible source lane from explicit source direction when present, otherwise default to Signal Discovery. Only run this after the Pick Provider source-selection checkpoint has been made visible and explained in chat/watchNarration. Send watchNarration with stage find-leads that says why this lane is being tried now, what quick sample or filter gate will pass/fail it, and why that helps this campaign. For Signal Discovery sampling, make it clear this is a viability path before lead import: generate intersection-first keyword lanes that combine the campaign anchor with the buyer pain/use case/ICP role, not broad anchor-only lanes. For Claude/GTM campaigns, prefer lanes like Claude outbound, Claude Code LinkedIn outreach, AI SDR Claude, GTM automation Claude, and founder-led sales Claude over generic Claude Code, MCP, AI agents, or agentic coding. If the first pass is broad, retarget around the campaign wedge before selecting posts. Promote/select the first narrow sample posts with select_promising_posts before fetch_post_engagers so the watched table shows the exact posts being sampled; the guide copy should say Codex is pulling sample engagers from these posts to confirm the ICP is actually engaging and estimate whether enough right-content posts exist for the target lead count. Before final source approval, compute eligible posts, sampled ICP-fit rate, target good-fit lead count, posts needed, selected posts, expected good-fit range, and scale fallback. If the lane fails, update currentStep and watchNarration before moving to Sales Nav recent activity, normal Sales Nav, or Prospeo."
569
572
  },
570
573
  {
571
574
  "action": "run_first_campaign_attached_source_search",
@@ -614,7 +617,7 @@
614
617
  "action": "run_subskill",
615
618
  "target": "find-leads",
616
619
  "mode": "campaign-attached-required",
617
- "sourceScoutRule": "Shell-first flow requires the CampaignOffer campaignId from durable state. Pass campaignId as campaignOfferId into every provider prompt/search that can persist source state (`get_provider_prompt({ provider, campaignOfferId, confirmed: true })`, `search_signals`, `search_sales_nav`, `search_prospeo`) and include currentStep for tools that accept it so the user can watch the selected source inside the campaign. Use the default sequential source viability funnel when the user did not specify a source: Signal Discovery first, then Sales Nav with recent activity, then general Sales Nav, then Prospeo only as fallback. For Signal Discovery, do not recommend from raw post count; sample engagers, calculate ICP-fit rate, target good-fit lead count, posts needed, selected posts, expected good-fit range, and scale fallback. Stop on the first viable source unless the user explicitly asked to compare. If the user names hiring signals, domains/accounts, supplied lists, posts/comments, or title/persona filters, start with the matching source instead. Parallel source scouts only when the user requested comparison, an existing parallel run is being resumed, or the first viable source is borderline and one cheap fallback check is needed. The later import_leads call must use the same campaignOfferId. Do not import, confirm, enrich, queue, or start leads during source discovery."
620
+ "sourceScoutRule": "Shell-first flow requires the CampaignOffer campaignId from durable state. Pass campaignId as campaignOfferId into every provider prompt/search that can persist source state (`get_provider_prompt({ provider, campaignOfferId, confirmed: true })`, `search_signals`, `search_sales_nav`, `search_prospeo`) and include currentStep for tools that accept it so the user can watch the selected source inside the campaign. Use the default sequential source viability funnel when the user did not specify a source: Signal Discovery first, then Sales Nav with recent activity, then general Sales Nav, then Prospeo only as fallback. For Signal Discovery, use intersection-first keyword lanes that combine the campaign anchor with the buyer pain/use case/ICP role; broad anchor-only lanes are fallback inventory, not selectable source lanes while narrower wedge lanes exist. Do not recommend from raw post count; sample engagers, calculate ICP-fit rate, target good-fit lead count, posts needed, selected posts, expected good-fit range, and scale fallback. Stop on the first viable source unless the user explicitly asked to compare. If the user names hiring signals, domains/accounts, supplied lists, posts/comments, or title/persona filters, start with the matching source instead. Parallel source scouts only when the user requested comparison, an existing parallel run is being resumed, or the first viable source is borderline and one cheap fallback check is needed. The later import_leads call must use the same campaignOfferId. Do not import, confirm, enrich, queue, or start leads during source discovery."
618
621
  },
619
622
  {
620
623
  "action": "optional_debug_artifacts",
@@ -79,14 +79,27 @@ Default source funnel:
79
79
  ```json
80
80
  {
81
81
  "stage": "find-leads",
82
- "headline": "Testing warm LinkedIn activity",
83
- "visibleState": "Codex is starting with recent post engagement because it gives the strongest message context if enough ICP-looking people are active there.",
84
- "agentIntent": "If this lane does not clear the quick sample gate, it will switch to Sales Nav with recent activity, then broader Sales Nav, and use Prospeo only as the fallback.",
82
+ "headline": "Choosing the lead source",
83
+ "visibleState": "The browser is on Pick Provider while Codex explains the source path before opening a provider lane.",
84
+ "agentIntent": "Codex will start with Signal Discovery when warm LinkedIn engagement looks plausible, then switch to Sales Nav or Prospeo only if the quick viability math fails.",
85
85
  "nextAction": "Review source",
86
86
  "safety": "No leads import until you approve the source."
87
87
  }
88
88
  ```
89
89
 
90
+ Signal Discovery viability handoff:
91
+
92
+ ```json
93
+ {
94
+ "stage": "find-leads",
95
+ "headline": "Checking Signal Discovery viability",
96
+ "visibleState": "The browser is moving from Pick Provider into Signal Discovery so the exact posts and sample math are visible.",
97
+ "agentIntent": "Codex is testing whether relevant posts have enough ICP-looking engagers before recommending this as the source.",
98
+ "nextAction": "Review source math",
99
+ "safety": "No leads import until you approve the source."
100
+ }
101
+ ```
102
+
90
103
  Source direction override:
91
104
 
92
105
  ```json
@@ -43,6 +43,9 @@ When `find-leads` is using Signals during preview, treat this as a spot check:
43
43
  ### Round 1: Initial Discovery
44
44
 
45
45
  - Generate 5 strategic keywords based on their ICP
46
+ - Prefer intersection keywords that combine the campaign's anchor topic with
47
+ the ICP pain/use case/role. Do not lead with broad anchor-only terms when the
48
+ campaign is narrower.
46
49
  - Cast a slightly wider net to understand the landscape
47
50
  - After results, analyze what's working
48
51
  - Estimate whether the results are likely to produce a usable conversation lane
@@ -122,6 +125,27 @@ Use conservative logic:
122
125
 
123
126
  You're NOT looking for generic buying intent keywords. You're looking for topics that attract YOUR SPECIFIC ICP:
124
127
 
128
+ ### Intersection-First Rule
129
+
130
+ When the campaign has an anchor technology, category, community, or named tool,
131
+ do not search only the anchor. Combine it with the campaign's buyer pain, use
132
+ case, workflow, or role so the resulting posts are likely to attract the right
133
+ ICP before any engager filtering.
134
+
135
+ For a campaign about Claude/AI workflows for GTM, better first-round keywords
136
+ look like:
137
+
138
+ - "Claude outbound"
139
+ - "Claude Code LinkedIn outreach"
140
+ - "AI SDR Claude"
141
+ - "GTM automation Claude"
142
+ - "founder led sales Claude"
143
+
144
+ Broad anchor-only keywords such as "Claude Code", "MCP", "AI agents", or
145
+ "agentic coding" are inventory probes only. Use them after narrow lanes fail or
146
+ as diagnostic context; do not select/promote broad posts when narrower
147
+ campaign-wedge posts exist.
148
+
125
149
  ### For Founder/Executive ICPs:
126
150
 
127
151
  - "founder mode", "founder led sales", "founder brand"
@@ -149,6 +173,10 @@ You're NOT looking for generic buying intent keywords. You're looking for topics
149
173
  - Each round must have DIFFERENT keywords (no repeats across rounds)
150
174
  - Use SINGLE keywords or short phrases only
151
175
  - DO NOT use boolean operators (OR, AND, NOT)
176
+ - At least 3 first-round keywords must be intersection keywords that include
177
+ both the anchor topic and the campaign pain/use case/ICP context.
178
+ - If search results come back broad, immediately run a refined round around the
179
+ campaign wedge before selecting posts or sampling engagers.
152
180
 
153
181
  Examples of GOOD keywords:
154
182