@sellable/mcp 0.1.104 → 0.1.105

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.
@@ -7,10 +7,10 @@ Required first step:
7
7
  - Load the canonical provider prompt before searching. If the parent supplies a
8
8
  draft `campaignOfferId`, call `get_provider_prompt({ provider:
9
9
  "signal-discovery", campaignOfferId, confirmed: true })` and include that same
10
- `campaignOfferId` in `search_signals` so the user can watch source work in the
11
- campaign UI. Treat that as a campaign-attached persisted search; do not run a
12
- post-mint search without the campaign ID. If no campaign ID is supplied, run
13
- campaignless preview mode.
10
+ `campaignOfferId` plus `currentStep: "signal-discovery"` in `search_signals`
11
+ so the user can watch source work in the campaign UI. Treat that as a
12
+ campaign-attached persisted search; do not run a post-mint search without the
13
+ campaign ID. If no campaign ID is supplied, run campaignless preview mode.
14
14
 
15
15
  Use the inherited Sellable MCP tools when available:
16
16
 
@@ -6,9 +6,10 @@ Required first step:
6
6
 
7
7
  - Load the canonical provider prompt before searching. If the parent supplies a
8
8
  draft `campaignOfferId`, call `get_provider_prompt({ provider: "prospeo",
9
- campaignOfferId, confirmed: true })` and include that same `campaignOfferId` in
10
- `search_prospeo` so the user can watch source work in the campaign UI. If no
11
- campaign ID is supplied, run campaignless preview mode. Treat post-mint
9
+ campaignOfferId, confirmed: true })` and include that same `campaignOfferId`
10
+ plus `currentStep: "prospeo"` in `search_prospeo` so the user can watch source
11
+ work in the campaign UI. If no campaign ID is supplied, run campaignless
12
+ preview mode. Treat post-mint
12
13
  searches with `campaignOfferId` as campaign-attached persisted search tabs;
13
14
  do not run a live campaign search without the campaign ID.
14
15
 
@@ -7,8 +7,9 @@ Required first step:
7
7
  - Load the canonical provider prompt before searching. If the parent supplies a
8
8
  draft `campaignOfferId`, call `get_provider_prompt({ provider: "sales-nav",
9
9
  campaignOfferId, confirmed: true })` and include that same `campaignOfferId` in
10
- `search_sales_nav` so the user can watch source work in the campaign UI. If no
11
- campaign ID is supplied, run campaignless preview mode. Treat post-mint
10
+ `search_sales_nav` with `currentStep: "sales-nav"` so the user can watch
11
+ source work in the campaign UI. If no campaign ID is supplied, run
12
+ campaignless preview mode. Treat post-mint
12
13
  searches with `campaignOfferId` as campaign-attached persisted search tabs;
13
14
  do not run a live campaign search without the campaign ID.
14
15
 
@@ -594,7 +594,7 @@ export const leadToolDefinitions = [
594
594
  },
595
595
  {
596
596
  name: "search_sales_nav",
597
- description: 'Search LinkedIn Sales Navigator. Requires get_provider_prompt({ provider: "sales-nav" }) first. Returns normalized results with pagination. `campaignOfferId` is optional for directional preview runs; include it only when the search should be associated with a campaign.',
597
+ description: 'Search LinkedIn Sales Navigator. Requires get_provider_prompt({ provider: "sales-nav" }) first. Returns normalized results with pagination. `campaignOfferId` is optional for directional preview runs; include it only when the search should be associated with a campaign. Post-mint create-campaign-v2 watch runs MUST pass campaignOfferId and currentStep: "sales-nav" so the search appears in the watched campaign UI. Omitting campaignOfferId post-mint orphans the search from the UI.',
598
598
  inputSchema: {
599
599
  type: "object",
600
600
  properties: {
@@ -739,7 +739,7 @@ export const leadToolDefinitions = [
739
739
  },
740
740
  {
741
741
  name: "search_prospeo",
742
- description: 'Search Prospeo for people using filters and optional domainFilterId. Requires get_provider_prompt({ provider: "prospeo" }) first. When targeting known accounts, call load_csv_domains for CSV-on-disk workflows or save_domain_filters for pasted/raw domain lists, then pass domainFilterId. Raw domain inputs and company-name targeting are NOT supported in this MCP tool. Strategy: start with 2-3 high-signal filters (title/seniority + industry or domainFilterId + headcount), then tighten one filter at a time. For security, AppSec, SOC, RevOps, Demand Gen, and similar function-specific lanes, do not widen with bare seniority labels like "Head" or "Director" alone; pair them with explicit function-title keywords and inspect the sample for off-function `Head of X` leakage. Prefer person location over company HQ unless HQ is explicitly needed. `campaignOfferId` routing rule: OMIT campaignOfferId ONLY in pre-mint Phase 84 `find leads` discovery mode (validating ICP before the commit gate). In every other context — post-mint lead additions, operator-driven searches on a live campaign, any search where the intent is to persist results to a specific campaign — you MUST pass campaignOfferId so the search shows up in that campaign\'s Contact Search panel. Omitting campaignOfferId post-mint orphans the search from the UI. Returns normalized results with pagination.',
742
+ description: 'Search Prospeo for people using filters and optional domainFilterId. Requires get_provider_prompt({ provider: "prospeo" }) first. When targeting known accounts, call load_csv_domains for CSV-on-disk workflows or save_domain_filters for pasted/raw domain lists, then pass domainFilterId. Raw domain inputs and company-name targeting are NOT supported in this MCP tool. Strategy: start with 2-3 high-signal filters (title/seniority + industry or domainFilterId + headcount), then tighten one filter at a time. For security, AppSec, SOC, RevOps, Demand Gen, and similar function-specific lanes, do not widen with bare seniority labels like "Head" or "Director" alone; pair them with explicit function-title keywords and inspect the sample for off-function `Head of X` leakage. Prefer person location over company HQ unless HQ is explicitly needed. `campaignOfferId` routing rule: OMIT campaignOfferId ONLY in pre-mint Phase 84 `find leads` discovery mode (validating ICP before the commit gate). In every other context — post-mint lead additions, operator-driven searches on a live campaign, any search where the intent is to persist results to a specific campaign — you MUST pass campaignOfferId so the search shows up in that campaign\'s Contact Search panel. Post-mint create-campaign-v2 watch runs MUST pass currentStep: "prospeo". Omitting campaignOfferId post-mint orphans the search from the UI. Returns normalized results with pagination.',
743
743
  inputSchema: {
744
744
  type: "object",
745
745
  properties: {
@@ -848,7 +848,7 @@ export const leadToolDefinitions = [
848
848
  },
849
849
  {
850
850
  name: "search_signals",
851
- description: 'Search LinkedIn posts for signal discovery. Requires get_provider_prompt({ provider: "signal-discovery" }) first. Supports keyword search, profile posts, company posts, or a single post URL. Use campaignless preview mode for directional discovery; include `campaignOfferId` only when the search should persist into campaign state. Returns a compact summary with recommended posts to avoid context bloat.',
851
+ description: 'Search LinkedIn posts for signal discovery. Requires get_provider_prompt({ provider: "signal-discovery" }) first. Supports keyword search, profile posts, company posts, or a single post URL. Use campaignless preview mode for directional discovery; include `campaignOfferId` when the search should persist into campaign state. Post-mint create-campaign-v2 watch runs MUST pass campaignOfferId and currentStep: "signal-discovery" so the search appears in the watched campaign UI. Omitting campaignOfferId post-mint orphans the search from the UI. Returns a compact summary with recommended posts to avoid context bloat.',
852
852
  inputSchema: {
853
853
  type: "object",
854
854
  properties: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.104",
3
+ "version": "0.1.105",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -432,6 +432,13 @@ to be worth a LinkedIn test. I'll compare source paths by expected volume,
432
432
  sampled ICP fit, activity/warmth signal, cleanup risk, and tradeoffs. This
433
433
  usually takes ~3-5 min, and I'll show you the source decision + sample before
434
434
  anything goes live.`
435
+ - In watch mode, do not leave the user sitting on only `pick-provider` while
436
+ source scouts run. Move the campaign to the likely primary source lane
437
+ (`signal-discovery`, `sales-nav`, or `prospeo`) before background source
438
+ scouts, then run the first campaign-attached provider prompt + provider search
439
+ in the parent thread with `campaignOfferId`, `confirmed: true`, and
440
+ `currentStep` when the tool accepts it. Background scouts may continue after
441
+ the visible campaign tab exists.
435
442
  - After the lead sample/source decision is ready and approved,
436
443
  show the next progress line:
437
444
  `Lead source is set. I'll import the first 15-row review batch into the
@@ -542,6 +549,11 @@ message we should test.`
542
549
  then draft the message from the same sample.` Never say `kicking off two
543
550
  workstreams`, `in parallel`, or `background` unless parallel branches were
544
551
  actually launched.
552
+ - Source scout parallelism must not hide all provider work from the watch UI.
553
+ The parent thread owns the first visible provider search: call the chosen
554
+ provider prompt/search with the minted CampaignOffer id and provider
555
+ `currentStep` before waiting on source-scout results, so relevant search tabs
556
+ appear in real time.
545
557
  - For post-lead workstreams, first call
546
558
  `get_post_find_leads_scout_registry` and launch exactly the returned
547
559
  `filter-leads` and `message-generation` scouts when real subagents are
@@ -520,6 +520,33 @@
520
520
  "when": "before_source_scouts_or_provider_search",
521
521
  "chatRenderRule": "Move the campaign watch view to Find Contacts before the main thread starts comparing source paths. Do not mention MCP or local artifacts."
522
522
  },
523
+ {
524
+ "action": "advance_watch_to_initial_source_lane",
525
+ "tool": "update_campaign",
526
+ "requiredFields": [
527
+ "campaignId",
528
+ "currentStep"
529
+ ],
530
+ "currentStepByPrimaryLane": {
531
+ "signals": "signal-discovery",
532
+ "salesNav": "sales-nav",
533
+ "prospeo": "prospeo",
534
+ "apollo": "apollo-ai",
535
+ "existingList": "saved-lists",
536
+ "uploadedDomains": "prospeo"
537
+ },
538
+ "when": "before_background_source_scouts",
539
+ "rule": "Choose the likely primary visible source lane from source intake, brief preference, or the best first lane the main thread will actually search. Do this before waiting on background scouts so watch mode never sits on only Pick Provider while source work happens elsewhere."
540
+ },
541
+ {
542
+ "action": "run_first_campaign_attached_source_search",
543
+ "requiredFields": [
544
+ "campaignOfferId",
545
+ "currentStep"
546
+ ],
547
+ "before": "waiting_on_background_source_scouts",
548
+ "rule": "Before relying on background source scouts, the parent thread must run the first provider prompt + provider search for the chosen visible lane with campaignOfferId and currentStep (signal-discovery, sales-nav, or prospeo) so the campaign UI creates the corresponding live search/tab. Background scouts may continue after that, but the user must see at least one relevant campaign-attached search begin in the watched page."
549
+ },
523
550
  {
524
551
  "action": "render_find_leads_progress",
525
552
  "requiredVisibleContent": [
@@ -555,7 +582,7 @@
555
582
  "action": "run_subskill",
556
583
  "target": "find-leads",
557
584
  "mode": "campaign-attached-required",
558
- "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`) so the user can watch the selected source inside the campaign. The later import_leads call must use the same campaignOfferId. When several source lanes are credible, scout them independently, then write one primary source recommendation and any runner-up tradeoffs. Do not import, confirm, enrich, queue, or start leads during source discovery."
585
+ "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. In watch mode, run the first campaign-attached provider search in the parent thread before waiting on background scouts; subagents can explore runner-up lanes after the visible campaign tab exists. The later import_leads call must use the same campaignOfferId. When several source lanes are credible, scout them independently, then write one primary source recommendation and any runner-up tradeoffs. Do not import, confirm, enrich, queue, or start leads during source discovery."
559
586
  },
560
587
  {
561
588
  "action": "optional_debug_artifacts",