@sellable/mcp 0.1.49 → 0.1.51

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.49",
3
+ "version": "0.1.51",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -92,8 +92,16 @@ clear business decisions, tradeoffs, and approval gates. Use product language:
92
92
  When explaining lead-source decisions, show the concrete counts behind the
93
93
  logic: lanes searched, timeframe, raw result counts, finalist posts or preview
94
94
  rows, sampled people, sampled fits as n/N (%), estimated usable people, and the
95
- confidence basis. Never show a percent like "73% match" without the numerator,
96
- denominator, and sample basis.
95
+ confidence basis. Break estimates out by provider/source angle in bullet form
96
+ instead of showing only one raw total. Each angle should show raw pool, sampled
97
+ fits as n/N, estimated good-fit range after cleanup, expected reply-rate range,
98
+ and confidence basis. Never show a percent like "73% match" without the
99
+ numerator, denominator, and sample basis.
100
+
101
+ Use rendered Markdown for campaign brief and lead-source chat, not fenced code
102
+ blocks. Keep lines short, use indexed section labels, and translate internal
103
+ sourcing terms into plain language. For example, explain "signal discovery" as
104
+ "looking for LinkedIn activity from people already talking about this problem."
97
105
 
98
106
  Every approval gate must include artifact access after the readable inline
99
107
  content. Show an `Open artifact:` line with the one key clickable markdown link
@@ -318,39 +318,63 @@ me`, `I’ll paste a different sender profile`, and `Other / custom`.
318
318
  persistence in this preamble.
319
319
 
320
320
  - Before asking for brief approval, render a slim approval brief in the chat and
321
- keep the rich current brief in `brief.md`. Do not ask the user to
321
+ keep the rich current brief in `brief.md`. Use rendered Markdown directly:
322
+ `##` heading, bold field labels, numbered section labels, and short bullets.
323
+ Do not wrap the user-facing approval view in a fenced code block because that
324
+ creates horizontal scrolling in Claude Code and Codex. Do not ask the user to
322
325
  approve a one-paragraph direction, a risk note, or hidden artifact they cannot
323
326
  inspect. The chat approval view should be skimmable in under 45 seconds; full
324
327
  reasoning, source notes, and robustness stay in the artifacts. Include these
325
- sections, with 1-2 short lines each:
328
+ sections, with short wrapped lines:
326
329
 
327
330
  ```text
328
- Campaign brief
331
+ ## Campaign brief
329
332
 
330
- Target:
331
- ... (include concrete role/title names, not just a broad persona)
333
+ **Decision:** ... (one sentence)
332
334
 
333
- Core pain:
334
- ...
335
+ **1. Target**
336
+ - ... (include concrete role/title names, not just a broad persona)
337
+ - ...
335
338
 
336
- Offer / CTA:
337
- ...
339
+ **2. Pain**
340
+ - ...
341
+ - ...
338
342
 
339
- Proof:
340
- ...
343
+ **3. Offer**
344
+ - ...
345
+ - ...
341
346
 
342
- Lead plan:
343
- ...
347
+ **4. Proof**
348
+ - ...
349
+ - ...
344
350
 
345
- Message angle:
346
- ...
351
+ **5. Lead plan**
352
+ I’ll look for people who are already showing signs this problem matters:
353
+ - people talking about ...
354
+ - people with roles like ...
355
+ - companies likely to feel ...
347
356
 
348
- Risks:
349
- ...
357
+ If that pool is too small or noisy, I’ll switch to broader LinkedIn title and
358
+ company filters.
350
359
 
351
- After approval:
352
- I’ll find good-fit LinkedIn leads, show you the source decision and sample, then
353
- draft the first message for review before anything goes live.
360
+ **6. Risks**
361
+ - ...
362
+ - ...
363
+
364
+ **7. After approval**
365
+ I’ll find good-fit LinkedIn leads, show the source decision and sample, then
366
+ draft the first message for review. Nothing goes live without approval.
367
+ ```
368
+
369
+ In the `Lead plan` section, do not expose internal provider shorthand as the
370
+ explanation. Avoid bare phrases like `signal discovery`, `founder-led GTM`,
371
+ `RevOps`, `outbound systems`, or `pipeline architecture` unless they are
372
+ translated into what the user can understand. For example:
373
+
374
+ ```text
375
+ I’ll start by looking for LinkedIn activity from founders and revenue leaders
376
+ who are talking about pipeline problems, CRM handoffs, outbound tooling, or
377
+ messy sales processes.
354
378
  ```
355
379
 
356
380
  Do not paste the full rich brief into chat for approval unless the user asks.
@@ -691,12 +715,17 @@ table with one row per selected or finalist post:
691
715
  `## Evidence Snapshot` must include a compact numbers-first table:
692
716
 
693
717
  - source lane / keyword or filter
718
+ - provider/source angle label, e.g. `Signals / AI outbound posts`,
719
+ `Sales Nav / active SaaS founders + GTM leaders`, or
720
+ `Prospeo / domain-filtered agencies`
694
721
  - timeframe searched
695
722
  - raw results found
696
723
  - finalist posts or preview rows reviewed
697
724
  - sampled people
698
725
  - sampled fits, shown as `n/N (%)`
699
726
  - estimated usable people
727
+ - estimated good-fit range after cleanup
728
+ - expected reply-rate range
700
729
  - confidence note (`sample-backed`, `directional`, or `needs more sample`)
701
730
 
702
731
  For Signals-first campaigns, `## Sample Leads` must group representative sample
@@ -709,13 +738,16 @@ range, and estimate basis. If exact performance data is unavailable, use a
709
738
  directional range and label it `directional`, not definitive.
710
739
 
711
740
  When showing `lead-review.md` to the user, render a slim decision summary in
712
- chat, not the full evidence table. The visible response must include:
741
+ chat, not the full evidence table. Use rendered Markdown directly with short
742
+ bullet lines; do not use fenced code blocks for the user-facing lead review.
743
+ The visible response must include:
713
744
 
714
745
  - `Lead source decision`
715
746
  - `Chosen source`
716
747
  - `Why it won`
717
- - `Key numbers` with raw volume, sampled fit rate as `n/N`, estimated usable
718
- leads, expected connection acceptance range, and expected reply rate range
748
+ - `Quick numbers` as bullet points, with one provider/source angle per bullet.
749
+ Each bullet must include raw volume, sampled fit rate as `n/N`, estimated
750
+ good-fit range after cleanup, and expected reply-rate range when available.
719
751
  - `Sample leads` with 3-5 representative `Name — Title, Company` rows
720
752
  - `Tradeoff`
721
753
  - `Open artifact: lead-review.md`
@@ -724,6 +756,20 @@ Keep `## Evidence Snapshot`, selected posts, discarded paths, full sample rows,
724
756
  and `lead-sample.json` details in artifacts. Do not show raw filesystem paths
725
757
  unless links cannot be created or the user asks.
726
758
 
759
+ Use this chat shape for the quick-number bullets:
760
+
761
+ ```text
762
+ **1. Quick numbers**
763
+ - **Signals / AI outbound posts:** 249 posts found. Sampled 40 engagers; 18/40
764
+ looked usable. Estimate: 100-250 good warm fits. Expected reply: 6-12%.
765
+ - **Sales Nav / active SaaS founders + GTM leaders:** 27,454 active profiles before
766
+ filtering. First 25 had 12 strong/probable fits. Estimate: 300-800 good fits
767
+ after title/company cleanup. Expected reply: 4-9%.
768
+ - **Prospeo / domain-filtered agencies:** 1,000+ likely contacts if we need scale,
769
+ but weaker LinkedIn activity. Estimate: 500-1,000 contacts. Expected reply:
770
+ 2-5%.
771
+ ```
772
+
727
773
  After the lead source is set, use this progress copy before the parallel
728
774
  filter/message work:
729
775
 
@@ -122,10 +122,23 @@ sampled engagers; 31 looked like real ICP fits, so I’d treat this as direction
122
122
  usable people if the remaining engagers behave similarly.
123
123
  ```
124
124
 
125
- Lead review chat should be short and numeric: chosen source, why it won, raw
126
- volume, sampled fit rate as `n/N`, estimated good fits, expected connection
127
- acceptance, expected reply rate, 3-5 sample leads, and one tradeoff. Full tables
128
- belong in `lead-review.md`.
125
+ Lead review chat should be short and numeric. It must use rendered Markdown,
126
+ not a fenced code block, and include bullet-pointed provider/source-angle
127
+ estimates, one bullet per angle, so the sourcing logic is easy to scan:
128
+
129
+ ```text
130
+ **1. Quick numbers**
131
+ - **Signals / AI outbound posts:** 249 posts found. Sampled 40 engagers; 18/40
132
+ looked usable. Estimate: 100-250 good warm fits.
133
+ - **Sales Nav / active SaaS founders + GTM leaders:** 27,454 active profiles before
134
+ filtering. First 25 had 12 strong/probable fits. Estimate: 300-800 good fits.
135
+ - **Sales Nav / agencies + GTM consultants:** Smaller but higher intent. Estimate:
136
+ 150-400 good fits.
137
+ ```
138
+
139
+ Then show chosen source, why it won, expected connection acceptance, expected
140
+ reply rate, 3-5 sample leads, and one tradeoff. Full tables belong in
141
+ `lead-review.md`.
129
142
 
130
143
  Lead filter chat should always show what changed: keep, exclude, why, expected
131
144
  impact, and `Open artifact: lead-filter.md`.
@@ -227,6 +227,7 @@
227
227
  "minimumVisibleBriefDetail": "slim_approval_brief_before_question",
228
228
  "requiredArtifactLinks": ["brief.md"],
229
229
  "artifactLinkTiming": "before_approval_question",
230
+ "chatRenderRule": "Show the brief as rendered Markdown, never as a fenced code block. Use ## Campaign brief, a one-sentence bold Decision, indexed bold section labels, and short bullets. In Lead plan, translate provider shorthand into plain user-facing language about who will be searched for and why; do not rely on bare terms like signal discovery, RevOps, outbound systems, or pipeline architecture.",
230
231
  "avoidQuestionWhenOnlyUsefulAnswerIs": "looks good"
231
232
  },
232
233
  {
@@ -385,6 +386,7 @@
385
386
  "why use or discard"
386
387
  ],
387
388
  "evidenceSnapshotRequiredFields": [
389
+ "provider/source angle label",
388
390
  "source lane or keyword",
389
391
  "timeframe searched",
390
392
  "raw results found",
@@ -392,12 +394,14 @@
392
394
  "sampled people",
393
395
  "sampled fits as n/N (%)",
394
396
  "estimated usable people",
397
+ "estimated good-fit range after cleanup",
398
+ "expected reply-rate range",
395
399
  "confidence note"
396
400
  ],
397
401
  "forbidPercentOnlyFitRates": true,
398
402
  "requiredArtifactLinks": ["lead-review.md"],
399
403
  "artifactLinkTiming": "before_next_step_or_revision_question",
400
- "chatRenderRule": "Show a slim decision summary only: chosen source, why it won, raw volume, sampled fit rate as n/N, estimated usable leads, expected connection acceptance range, expected reply rate range, 3-5 representative sample leads, and one tradeoff. Keep evidence tables, selected posts, discarded paths, full sample rows, and lead-sample.json details in lead-review.md. Do not show plain filesystem paths unless links cannot be created."
404
+ "chatRenderRule": "Show a slim rendered-Markdown decision summary only, never a fenced code block. Use indexed sections and short bullets: chosen source, why it won, bullet-pointed Quick numbers with one provider/source angle per bullet, raw volume, sampled fit rate as n/N, estimated good-fit range after cleanup, expected connection acceptance range, expected reply rate range, 3-5 representative sample leads, and one tradeoff. Keep evidence tables, selected posts, discarded paths, full sample rows, and lead-sample.json details in lead-review.md. Do not show plain filesystem paths unless links cannot be created."
401
405
  },
402
406
  {
403
407
  "action": "render_post_lead_parallel_progress",
@@ -131,6 +131,20 @@ usable leads after filtering, likely connection acceptance range, likely reply
131
131
  range, and estimate basis. If exact performance data is unavailable, use a
132
132
  directional range and label it `directional`, not definitive.
133
133
 
134
+ `## Evidence Snapshot` and the visible lead-review chat must break estimates out
135
+ by provider/source angle. Do not collapse everything into one raw count. Use
136
+ one row or bullet per angle. The visible chat version should be rendered
137
+ Markdown with indexed sections and short bullets, not a fenced code block. For
138
+ example:
139
+
140
+ - `Signals / AI outbound posts`
141
+ - `Sales Nav / active SaaS founders + GTM leaders`
142
+ - `Sales Nav / agencies + GTM consultants`
143
+ - `Prospeo / domain-filtered agencies`
144
+
145
+ Each angle must show raw pool, sampled fits as `n/N`, estimated good-fit range
146
+ after cleanup, expected reply-rate range, and confidence basis.
147
+
134
148
  `lead-sample.json` must include enough structured lead data for downstream
135
149
  filtering:
136
150