@sellable/mcp 0.1.83 → 0.1.84

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.
@@ -77,12 +77,14 @@ function isVersionOutdated(currentVersion, latestVersion) {
77
77
  }
78
78
  return false;
79
79
  }
80
- function readCache(ttlMs) {
80
+ function readCache(ttlMs, currentVersion) {
81
81
  const file = cachePath();
82
82
  try {
83
83
  const raw = JSON.parse(fs.readFileSync(file, "utf8"));
84
84
  if (!raw.checkedAtMs || Date.now() - raw.checkedAtMs > ttlMs)
85
85
  return null;
86
+ if (raw.mcp?.currentVersion !== currentVersion)
87
+ return null;
86
88
  return {
87
89
  ...raw,
88
90
  cachePath: file,
@@ -157,7 +159,7 @@ export async function checkForUpdates(options) {
157
159
  return disabledStatus(currentVersion);
158
160
  }
159
161
  if (!options?.force) {
160
- const cached = readCache(ttlMs);
162
+ const cached = readCache(ttlMs, currentVersion);
161
163
  if (cached)
162
164
  return cached;
163
165
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.83",
3
+ "version": "0.1.84",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -108,6 +108,13 @@ rows, sampled people, sampled fits as n/N (%), estimated usable people, and the
108
108
  confidence basis. Never show a percent like "73% match" without the numerator,
109
109
  denominator, and sample basis.
110
110
 
111
+ Do not forecast LinkedIn connection acceptance rates, reply rates, meetings,
112
+ pipeline, revenue, or ROI in customer-facing source reviews unless the user
113
+ supplied verified benchmark data for this exact workspace/sender. Without that
114
+ data, compare sources by source volume, sampled ICP fit, activity/warmth
115
+ signals, cleanup risk, and confidence basis. If a user asks for a forecast,
116
+ label it explicitly as not estimated from this run.
117
+
111
118
  When the user has not supplied a source and multiple source angles are viable,
112
119
  scout those angles as independent branches when the host can actually do it:
113
120
  LinkedIn Engagement / active post engagers (internal `signal-discovery`
@@ -198,9 +198,9 @@ Validated draft directory:
198
198
  web lookup.
199
199
  - Existing client prospect id: use it directly and do one company/profile
200
200
  lookup only if a URL/domain is also available.
201
- Then summarize what you found in one or two lines and ask the user to confirm
202
- the campaign identity/focus before continuing. Do not mention connected sender
203
- availability in this confirmation.
201
+ Then summarize what you found in one or two lines and ask the user to confirm
202
+ the campaign identity/focus before continuing. Do not mention connected sender
203
+ availability in this confirmation.
204
204
  - If the user did not provide the launch identity, ask in normal chat for the
205
205
  LinkedIn profile or company website to use as the campaign identity. Do not ask
206
206
  them to choose an input type with the structured question tool:
@@ -380,11 +380,11 @@ brief`, `Revise target`, `Revise offer/proof`, and `Other / custom`.
380
380
  finish the write synchronously at that boundary.
381
381
 
382
382
  - After the brief is approved or auto-confirmed, show the next progress line:
383
- `Cool. Now I'm going to find people who are both a good fit and likely to
384
- reply on LinkedIn. I'll compare source paths by expected volume, likely
385
- connection acceptance rate, likely reply rate, signal quality, and tradeoffs.
386
- This usually takes ~3-5 min, and I'll show you the source decision + sample
387
- before anything goes live.`
383
+ `Cool. Now I'm going to find people who are both a good fit and active enough
384
+ to be worth a LinkedIn test. I'll compare source paths by expected volume,
385
+ sampled ICP fit, activity/warmth signal, cleanup risk, and tradeoffs. This
386
+ usually takes ~3-5 min, and I'll show you the source decision + sample before
387
+ anything goes live.`
388
388
  - After the lead sample/source decision is ready and approved or auto-confirmed,
389
389
  show the next progress line:
390
390
  `Lead source is set. I'll import the first 10-row review batch into the
@@ -775,9 +775,13 @@ usable leads`.
775
775
  - preview count
776
776
  - ICP match rate with numerator/denominator and sample basis; never percent-only
777
777
  - volume comparison
778
- - expected LinkedIn funnel: likely connection acceptance range, likely reply
779
- range, and whether the estimate is sample-backed, historical, founder-supplied,
780
- or directional
778
+ - source viability: expected source volume, expected usable leads after
779
+ filtering, source activity/warmth indicators, cleanup risk, and confidence
780
+ basis
781
+ - do not forecast connection acceptance, reply rate, meetings, pipeline,
782
+ revenue, or ROI unless the user supplied verified benchmark data for this
783
+ exact workspace/sender. If no verified benchmark exists, state that
784
+ performance is not estimated from this source review.
781
785
  - for Signals-first paths: top candidate posts reviewed, selected post URLs,
782
786
  post author, post topic/excerpt, post age or posted date, engagement count,
783
787
  sampled engager count per selected post, sampled fit count per selected post,
@@ -801,7 +805,7 @@ customer-visible sections with literal headings:
801
805
  - `## Source Decision`
802
806
  - `## Evidence Snapshot`
803
807
  - `## Selected Signal Posts` for Signals-first campaigns
804
- - `## Expected LinkedIn Funnel`
808
+ - `## Source Viability`
805
809
  - `## Sample Leads` for Signals-first campaigns
806
810
  - `## Pros`
807
811
  - `## Tradeoffs`
@@ -835,10 +839,11 @@ For Signals-first campaigns, `## Sample Leads` must group representative sample
835
839
  rows by source post when possible, so the user can see not just that the search
836
840
  found posts, but which posts produce believable prospects.
837
841
 
838
- `## Expected LinkedIn Funnel` must include expected source volume, expected
839
- usable leads after filtering, likely connection acceptance range, likely reply
840
- range, and estimate basis. If exact performance data is unavailable, use a
841
- directional range and label it `directional`, not definitive.
842
+ `## Source Viability` must include expected source volume, expected usable
843
+ leads after filtering, source activity/warmth indicators, cleanup risk, and
844
+ estimate basis. Do not include likely connection acceptance or reply-rate
845
+ ranges unless verified benchmark data was supplied by the user for this exact
846
+ workspace/sender.
842
847
 
843
848
  When showing `lead-review.md` to the user, render a slim decision summary in
844
849
  chat, not the full evidence table. Use rendered Markdown directly with short
@@ -858,7 +863,8 @@ user-facing lead review. The visible response must include:
858
863
  - `Why it won`
859
864
  - `Quick numbers` as bullet points, with one provider/source angle per bullet.
860
865
  Each bullet must include raw volume, sampled fit rate as `n/N`, estimated
861
- good-fit range after cleanup, and expected reply-rate range when available.
866
+ good-fit range after cleanup, source activity/warmth basis, and confidence
867
+ note.
862
868
  - If Signals was searched or considered, `Signal keyword lanes` as a compact
863
869
  table with keyword lane, timeframe, posts found, and finalist posts reviewed.
864
870
  - If Signals was searched or considered, `LinkedIn posts sampled` as a compact
@@ -475,13 +475,13 @@
475
475
  {
476
476
  "action": "render_find_leads_progress",
477
477
  "requiredVisibleContent": [
478
- "good fit and likely to reply on LinkedIn",
478
+ "good fit and active enough to be worth a LinkedIn test",
479
479
  "campaign source step",
480
480
  "primary source",
481
481
  "expected volume",
482
- "likely connection acceptance rate",
483
- "likely reply rate",
484
- "signal quality",
482
+ "sampled ICP fit",
483
+ "activity/warmth signal",
484
+ "cleanup risk",
485
485
  "tradeoffs",
486
486
  "search lanes",
487
487
  "timeframe",
@@ -639,7 +639,6 @@
639
639
  "sampled fits as n/N (%)",
640
640
  "estimated usable people",
641
641
  "estimated good-fit range after cleanup",
642
- "expected reply-rate range",
643
642
  "confidence note"
644
643
  ],
645
644
  "sourceDecisionRequiredFields": [
@@ -668,7 +667,7 @@
668
667
  "artifactLinkTiming": "before_next_step_or_revision_question",
669
668
  "doNotCompressToSummaryOnly": false,
670
669
  "doNotRenderArtifactLinksOnly": true,
671
- "chatRenderRule": "Show a slim rendered-Markdown decision summary only, never a fenced code block. The first sentence must make the decision explicit: 'I recommend {primary source} using {exact filter/source recipe}. The runner-up is {source} because {reason}.' Use indexed sections and short bullets: recommendation, Primary source and filters, Runner-up sources, why it won, Quick numbers with one provider/source angle per bullet, raw volume, sampled fit rate as n/N, estimated good-fit range after cleanup, expected reply rate range, 3-5 representative sample leads, and one tradeoff. If Signals was searched or considered, include two compact inline Markdown tables before the recommendation is treated as final: Signal keyword lanes with keyword lane, timeframe, posts found, and finalist posts reviewed; and LinkedIn posts sampled with post URL/title, author/topic, age, engagers, sampled engagers, good fits as n/N, estimated usable prospects per post, and use/discard decision. Default to selecting a few promising Signals posts for the first sample instead of trying to prove full Signals scale up front; if the sample is good but volume is low, say how many more posts to add/scrape next. Do not skip or discard Signals based only on raw post count or vibes; show the post-level math first, or explicitly say no engagers could be fetched and lower confidence. Keep 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."
670
+ "chatRenderRule": "Show a slim rendered-Markdown decision summary only, never a fenced code block. The first sentence must make the decision explicit: 'I recommend {primary source} using {exact filter/source recipe}. The runner-up is {source} because {reason}.' Use indexed sections and short bullets: recommendation, Primary source and filters, Runner-up sources, why it won, Quick numbers with one provider/source angle per bullet, raw volume, sampled fit rate as n/N, estimated good-fit range after cleanup, activity/warmth basis, confidence note, 3-5 representative sample leads, and one tradeoff. Do not forecast connection acceptance rates, reply rates, meetings, pipeline, revenue, or ROI unless the user supplied verified benchmark data for this exact workspace/sender. If Signals was searched or considered, include two compact inline Markdown tables before the recommendation is treated as final: Signal keyword lanes with keyword lane, timeframe, posts found, and finalist posts reviewed; and LinkedIn posts sampled with post URL/title, author/topic, age, engagers, sampled engagers, good fits as n/N, estimated usable prospects per post, and use/discard decision. Default to selecting a few promising Signals posts for the first sample instead of trying to prove full Signals scale up front; if the sample is good but volume is low, say how many more posts to add/scrape next. Do not skip or discard Signals based only on raw post count or vibes; show the post-level math first, or explicitly say no engagers could be fetched and lower confidence. Keep 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."
672
671
  },
673
672
  {
674
673
  "action": "render_post_lead_parallel_progress",
@@ -95,7 +95,7 @@ Use a compact markdown report with these sections:
95
95
  - Preview Count: {n}
96
96
  - ICP Match Rate: {x/y or % if supportable}
97
97
  - Volume Comparison: above target | in range | below target
98
- - Expected LinkedIn Funnel: connection acceptance {range}, reply {range}, estimate basis {sample-backed | historical | founder-supplied | directional}
98
+ - Source Viability: source volume {n or range}, usable leads after filtering {n or range}, activity/warmth basis {sample-backed | directional | needs more sample}, cleanup risk {low | medium | high}
99
99
 
100
100
  ## Source Decision
101
101
 
@@ -108,13 +108,13 @@ Use a compact markdown report with these sections:
108
108
  - Approval Meaning: approving this source means {what will be sampled/imported
109
109
  next}
110
110
 
111
- ## Expected LinkedIn Funnel
111
+ ## Source Viability
112
112
 
113
113
  - Source Volume: {n or range}
114
114
  - Expected Usable Leads After Filtering: {n or range}
115
- - Likely Connection Acceptance: {range}
116
- - Likely Reply Rate: {range}
117
- - Estimate Basis: sample-backed | historical | founder-supplied | directional
115
+ - Activity/Warmth Basis: sample-backed | directional | needs more sample
116
+ - Cleanup Risk: low | medium | high
117
+ - Performance Forecast: not estimated unless the user supplied verified benchmark data for this exact workspace/sender
118
118
 
119
119
  ## Signal Keyword Lanes
120
120
 
@@ -114,9 +114,12 @@ Lead preview must:
114
114
  - preview count
115
115
  - ICP match rate
116
116
  - volume comparison
117
- - expected LinkedIn funnel: likely connection acceptance range, likely reply
118
- range, and whether the estimate is sample-backed, historical, founder-supplied,
119
- or directional
117
+ - source viability: expected source volume, expected usable leads after
118
+ filtering, source activity/warmth indicators, cleanup risk, and confidence
119
+ basis
120
+ - no connection acceptance, reply-rate, meeting, pipeline, revenue, or ROI
121
+ forecast unless the user supplied verified benchmark data for this exact
122
+ workspace/sender
120
123
  - source decision: best path, why it won, pros, cons/tradeoffs, and discarded
121
124
  source paths with the reason each lost
122
125
  - false-positive patterns
@@ -126,15 +129,16 @@ For normal LinkedIn discovery, `lead-review.md` must include literal
126
129
  customer-visible headings:
127
130
 
128
131
  - `## Source Decision`
129
- - `## Expected LinkedIn Funnel`
132
+ - `## Source Viability`
130
133
  - `## Pros`
131
134
  - `## Tradeoffs`
132
135
  - `## Discarded Paths`
133
136
 
134
- `## Expected LinkedIn Funnel` must include expected source volume, expected
135
- usable leads after filtering, likely connection acceptance range, likely reply
136
- range, and estimate basis. If exact performance data is unavailable, use a
137
- directional range and label it `directional`, not definitive.
137
+ `## Source Viability` must include expected source volume, expected usable
138
+ leads after filtering, source activity/warmth indicators, cleanup risk, and
139
+ estimate basis. Do not include likely connection acceptance or reply-rate
140
+ ranges unless verified benchmark data was supplied by the user for this exact
141
+ workspace/sender.
138
142
 
139
143
  `lead-sample.json` must include enough structured lead data for downstream
140
144
  filtering:
@@ -343,10 +343,13 @@ Use first when LinkedIn activity plus tighter role / company filters matter.
343
343
  - For InMail or LinkedIn-send motions, establish the baseline TAM first, then test a `POSTED_ON_LINKEDIN` slice when the pool can still sustain a campaign.
344
344
  - Treat recent posters as a preferred first-send slice, not just a nice-to-have proxy. When the recently-posted slice still yields enough projected good fits, prefer it because reply / acceptance performance is usually materially better than the cold full-TAM pool.
345
345
  - When explaining a LinkedIn source decision, make the buying logic obvious:
346
- pick people who are both good fits and likely to reply. Compare source paths
347
- by expected volume, likely connection acceptance, likely reply rate, signal
348
- quality, and tradeoffs. Use sample-backed or historical numbers when
349
- available; otherwise label ranges as directional.
346
+ pick people who are good fits and active enough to be worth a LinkedIn test.
347
+ Compare source paths by expected volume, sampled ICP fit, activity/warmth
348
+ signal, cleanup risk, and tradeoffs.
349
+ - Do not forecast connection acceptance rates, reply rates, meetings, pipeline,
350
+ revenue, or ROI unless the user supplied verified benchmark data for this
351
+ exact workspace/sender. Without that data, say performance is not estimated
352
+ from the source review.
350
353
  - Use these rough planning bands only as directional defaults when better
351
354
  workspace/founder data is not available: Signals/recent engagers = lower
352
355
  volume, higher reply upside; Sales Nav with recent LinkedIn activity = medium