@sellable/mcp 0.1.50 → 0.1.52

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.50",
3
+ "version": "0.1.52",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -98,6 +98,13 @@ fits as n/N, estimated good-fit range after cleanup, expected reply-rate range,
98
98
  and confidence basis. Never show a percent like "73% match" without the
99
99
  numerator, denominator, and sample basis.
100
100
 
101
+ Use rendered Markdown for any user review surface, not fenced code blocks. This
102
+ includes campaign brief, lead source, lead filter, message review, and final
103
+ approval. Keep lines short, use indexed section labels and bullets, and
104
+ translate internal sourcing terms into plain language. For example, explain
105
+ "signal discovery" as "looking for LinkedIn activity from people already
106
+ talking about this problem."
107
+
101
108
  Every approval gate must include artifact access after the readable inline
102
109
  content. Show an `Open artifact:` line with the one key clickable markdown link
103
110
  for that stage. Do not show raw filesystem paths unless links cannot be created
@@ -141,6 +141,29 @@ Validated draft directory:
141
141
  approval/review, lead-filter review, message review, and final approval
142
142
  packet. Do not use the link as a substitute for rendering the decision in
143
143
  chat; links are for deeper inspection.
144
+ - Any time the user is reviewing a list or decision, use rendered Markdown with
145
+ short indexed sections and bullets. Do not use label-plus-paragraph blocks
146
+ like `Key numbers:` followed by one long paragraph. Do not use fenced code
147
+ blocks for review surfaces. The readable chat surface should look like:
148
+
149
+ ```text
150
+ ## Lead source decision
151
+
152
+ **1. Chosen source**
153
+ - Signals, with a strict filter
154
+
155
+ **2. Quick numbers**
156
+ - **Signals:** 491 posts reviewed. 9/40 sampled engagers fit. Estimate:
157
+ 180-260 usable leads.
158
+ - **Sales Nav:** 2,598 active profiles. Preview was broader and noisier.
159
+
160
+ **3. Sample leads**
161
+ - Joyjit Ghosh — Co-Founder, Prospectee.io
162
+ - Ashish Rai — Founder & CEO, ReachHQ
163
+
164
+ **4. Tradeoff**
165
+ - More context, but the filter needs to cut consultants and creators.
166
+ ```
144
167
  - Do not treat the active Sellable workspace as the campaign subject. The
145
168
  workspace only tells you where the campaign will be saved. Before buyer, CTA,
146
169
  proof, or source questions, identify two things:
@@ -318,39 +341,63 @@ me`, `I’ll paste a different sender profile`, and `Other / custom`.
318
341
  persistence in this preamble.
319
342
 
320
343
  - 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
344
+ keep the rich current brief in `brief.md`. Use rendered Markdown directly:
345
+ `##` heading, bold field labels, numbered section labels, and short bullets.
346
+ Do not wrap the user-facing approval view in a fenced code block because that
347
+ creates horizontal scrolling in Claude Code and Codex. Do not ask the user to
322
348
  approve a one-paragraph direction, a risk note, or hidden artifact they cannot
323
349
  inspect. The chat approval view should be skimmable in under 45 seconds; full
324
350
  reasoning, source notes, and robustness stay in the artifacts. Include these
325
- sections, with 1-2 short lines each:
351
+ sections, with short wrapped lines:
326
352
 
327
353
  ```text
328
- Campaign brief
354
+ ## Campaign brief
355
+
356
+ **Decision:** ... (one sentence)
357
+
358
+ **1. Target**
359
+ - ... (include concrete role/title names, not just a broad persona)
360
+ - ...
329
361
 
330
- Target:
331
- ... (include concrete role/title names, not just a broad persona)
362
+ **2. Pain**
363
+ - ...
364
+ - ...
332
365
 
333
- Core pain:
334
- ...
366
+ **3. Offer**
367
+ - ...
368
+ - ...
335
369
 
336
- Offer / CTA:
337
- ...
370
+ **4. Proof**
371
+ - ...
372
+ - ...
338
373
 
339
- Proof:
340
- ...
374
+ **5. Lead plan**
375
+ I’ll look for people who are already showing signs this problem matters:
376
+ - people talking about ...
377
+ - people with roles like ...
378
+ - companies likely to feel ...
341
379
 
342
- Lead plan:
343
- ...
380
+ If that pool is too small or noisy, I’ll switch to broader LinkedIn title and
381
+ company filters.
344
382
 
345
- Message angle:
346
- ...
383
+ **6. Risks**
384
+ - ...
385
+ - ...
347
386
 
348
- Risks:
349
- ...
387
+ **7. After approval**
388
+ I’ll find good-fit LinkedIn leads, show the source decision and sample, then
389
+ draft the first message for review. Nothing goes live without approval.
390
+ ```
391
+
392
+ In the `Lead plan` section, do not expose internal provider shorthand as the
393
+ explanation. Avoid bare phrases like `signal discovery`, `founder-led GTM`,
394
+ `RevOps`, `outbound systems`, or `pipeline architecture` unless they are
395
+ translated into what the user can understand. For example:
350
396
 
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.
397
+ ```text
398
+ I’ll start by looking for LinkedIn activity from founders and revenue leaders
399
+ who are talking about pipeline problems, CRM handoffs, outbound tooling, or
400
+ messy sales processes.
354
401
  ```
355
402
 
356
403
  Do not paste the full rich brief into chat for approval unless the user asks.
@@ -714,7 +761,9 @@ range, and estimate basis. If exact performance data is unavailable, use a
714
761
  directional range and label it `directional`, not definitive.
715
762
 
716
763
  When showing `lead-review.md` to the user, render a slim decision summary in
717
- chat, not the full evidence table. The visible response must include:
764
+ chat, not the full evidence table. Use rendered Markdown directly with short
765
+ bullet lines; do not use fenced code blocks for the user-facing lead review.
766
+ The visible response must include:
718
767
 
719
768
  - `Lead source decision`
720
769
  - `Chosen source`
@@ -733,13 +782,13 @@ unless links cannot be created or the user asks.
733
782
  Use this chat shape for the quick-number bullets:
734
783
 
735
784
  ```text
736
- Quick numbers:
737
- - Signals / AI outbound posts: 249 posts found. Sampled 40 engagers; 18/40
785
+ **1. Quick numbers**
786
+ - **Signals / AI outbound posts:** 249 posts found. Sampled 40 engagers; 18/40
738
787
  looked usable. Estimate: 100-250 good warm fits. Expected reply: 6-12%.
739
- - Sales Nav / active SaaS founders + GTM leaders: 27,454 active profiles before
788
+ - **Sales Nav / active SaaS founders + GTM leaders:** 27,454 active profiles before
740
789
  filtering. First 25 had 12 strong/probable fits. Estimate: 300-800 good fits
741
790
  after title/company cleanup. Expected reply: 4-9%.
742
- - Prospeo / domain-filtered agencies: 1,000+ likely contacts if we need scale,
791
+ - **Prospeo / domain-filtered agencies:** 1,000+ likely contacts if we need scale,
743
792
  but weaker LinkedIn activity. Estimate: 500-1,000 contacts. Expected reply:
744
793
  2-5%.
745
794
  ```
@@ -828,22 +877,24 @@ Required behavior:
828
877
  - `Implementation Details`
829
878
 
830
879
  When showing the filter result in chat, render a slim summary before moving to
831
- message review:
880
+ message review. Use rendered Markdown, indexed sections, and short bullets:
832
881
 
833
882
  ```text
834
- Lead filter
883
+ ## Lead filter
835
884
 
836
- Keep:
837
- {1-3 lines}
885
+ **1. Keep**
886
+ - {role/title family}
887
+ - {company/context family}
838
888
 
839
- Exclude:
840
- {1-3 lines}
889
+ **2. Exclude**
890
+ - {false-positive family}
891
+ - {false-positive family}
841
892
 
842
- Why:
843
- {sample-backed reason}
893
+ **3. Why**
894
+ - {sample-backed reason}
844
895
 
845
- Expected impact:
846
- {1 line}
896
+ **4. Expected impact**
897
+ - {1 line}
847
898
 
848
899
  Open artifact: lead-filter.md
849
900
  ```
@@ -891,7 +942,8 @@ Continue chunked-read until `hasMore=false`. Treat all chunks as one prompt load
891
942
  Do NOT proceed to Step 4 (message review gate) without loading and following the full generate-messages workflow. `message-validation.md` must prove the full workflow ran (all required sections present + raw sendable Selected Winner) before `message-review.md` can recommend `approve-message`. If the message review or approval packet is ready but the generate-messages prompt was not retrieved in this run, route back to message-generation instead of asking the commit gate.
892
943
 
893
944
  When showing message review in chat, lead with one fully filled sample message,
894
- not the tokenized template. The visible response must include:
945
+ not the tokenized template. Use rendered Markdown, indexed sections, and short
946
+ bullets around the sample. The visible response must include:
895
947
 
896
948
  - `Message review`
897
949
  - `Subject`
@@ -908,7 +960,8 @@ artifacts.
908
960
  ## Step 4: Final Approval Packet
909
961
 
910
962
  When showing the final approval packet, render a slim "ready to create" summary
911
- in chat. The visible response must include:
963
+ in chat. Use rendered Markdown, indexed sections, and short bullets. The visible
964
+ response must include:
912
965
 
913
966
  - `Ready to create campaign`
914
967
  - `Campaign`
@@ -58,6 +58,10 @@ turn anchored to that:
58
58
  Approvals only feel safe when the user can see what they are approving. Before
59
59
  any approve/revise question, show the relevant decision in plain language. For a
60
60
  brief approval, render the slim approval brief, not just a direction summary.
61
+ Any list the user is expected to review should be rendered Markdown with short
62
+ indexed sections and bullets. Avoid label-plus-paragraph blocks like
63
+ `Key numbers:` followed by a dense paragraph, and never use fenced code blocks
64
+ for review surfaces.
61
65
 
62
66
  Every approval should also give the user a way to inspect the source artifact.
63
67
  After the readable inline content, include an `Open artifact:` line with the one
@@ -122,17 +126,17 @@ sampled engagers; 31 looked like real ICP fits, so I’d treat this as direction
122
126
  usable people if the remaining engagers behave similarly.
123
127
  ```
124
128
 
125
- Lead review chat should be short and numeric. It must include bullet-pointed
126
- provider/source-angle estimates, one bullet per angle, so the sourcing logic is
127
- easy to scan:
129
+ Lead review chat should be short and numeric. It must use rendered Markdown,
130
+ not a fenced code block, and include bullet-pointed provider/source-angle
131
+ estimates, one bullet per angle, so the sourcing logic is easy to scan:
128
132
 
129
133
  ```text
130
- Quick numbers:
131
- - Signals / AI outbound posts: 249 posts found. Sampled 40 engagers; 18/40
134
+ **1. Quick numbers**
135
+ - **Signals / AI outbound posts:** 249 posts found. Sampled 40 engagers; 18/40
132
136
  looked usable. Estimate: 100-250 good warm fits.
133
- - Sales Nav / active SaaS founders + GTM leaders: 27,454 active profiles before
137
+ - **Sales Nav / active SaaS founders + GTM leaders:** 27,454 active profiles before
134
138
  filtering. First 25 had 12 strong/probable fits. Estimate: 300-800 good fits.
135
- - Sales Nav / agencies + GTM consultants: smaller but higher intent. Estimate:
139
+ - **Sales Nav / agencies + GTM consultants:** Smaller but higher intent. Estimate:
136
140
  150-400 good fits.
137
141
  ```
138
142
 
@@ -140,14 +144,18 @@ Then show chosen source, why it won, expected connection acceptance, expected
140
144
  reply rate, 3-5 sample leads, and one tradeoff. Full tables belong in
141
145
  `lead-review.md`.
142
146
 
143
- Lead filter chat should always show what changed: keep, exclude, why, expected
144
- impact, and `Open artifact: lead-filter.md`.
147
+ Lead filter chat should always use indexed rendered Markdown and show what
148
+ changed: keep, exclude, why, expected impact, and
149
+ `Open artifact: lead-filter.md`.
145
150
 
146
- Final approval chat should be a ready-to-create summary: campaign, target with
147
- concrete role/title names, lead source, filter, one filled sample message, what
148
- approval creates, and the safety note that nothing sends live until greenlight.
149
- Do not include sequence/settings in final approval; that belongs after campaign
150
- creation.
151
+ Message review chat should use indexed rendered Markdown, show one fully filled
152
+ sample message without tokens, and keep tokenized templates in the artifact.
153
+
154
+ Final approval chat should use indexed rendered Markdown for a ready-to-create
155
+ summary: campaign, target with concrete role/title names, lead source, filter,
156
+ one filled sample message, what approval creates, and the safety note that
157
+ nothing sends live until greenlight. Do not include sequence/settings in final
158
+ approval; that belongs after campaign creation.
151
159
 
152
160
  Avoid:
153
161
 
@@ -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
  {
@@ -400,7 +401,7 @@
400
401
  "forbidPercentOnlyFitRates": true,
401
402
  "requiredArtifactLinks": ["lead-review.md"],
402
403
  "artifactLinkTiming": "before_next_step_or_revision_question",
403
- "chatRenderRule": "Show a slim decision summary only: 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."
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."
404
405
  },
405
406
  {
406
407
  "action": "render_post_lead_parallel_progress",
@@ -482,7 +483,7 @@
482
483
  "Expected impact"
483
484
  ],
484
485
  "requiredArtifactLinks": ["lead-filter.md"],
485
- "chatRenderRule": "Show a slim filter summary before message review: who we keep, who we exclude, sample-backed reason, and expected impact. Keep production rubric fields and rubric.json details in lead-filter.md/rubric.json. Do not show plain filesystem paths unless links cannot be created."
486
+ "chatRenderRule": "Show a slim rendered-Markdown filter summary before message review, never a fenced code block. Use ## Lead filter plus indexed sections and short bullets for who we keep, who we exclude, sample-backed reason, and expected impact. Keep production rubric fields and rubric.json details in lead-filter.md/rubric.json. Do not show plain filesystem paths unless links cannot be created."
486
487
  },
487
488
  {
488
489
  "action": "ask_revise_only_if_filter_is_not_confirmed",
@@ -651,7 +652,7 @@
651
652
  "Question: approve-message or revise-messaging?",
652
653
  "Recommendation:"
653
654
  ],
654
- "chatRenderRule": "Show one fully filled sample message with no {{tokens}} before asking for approval. Include subject, sample message, why it should work, one concern or None, recommendation, and Open artifact: message-review.md. Keep tokenized template, token fill basis, rendered examples, good/bad token fill examples, validation notes, and message-validation.md details in artifacts. Do not show plain filesystem paths unless links cannot be created.",
655
+ "chatRenderRule": "Show a slim rendered-Markdown message review, never a fenced code block. Use ## Message review plus indexed sections and short bullets. Show one fully filled sample message with no {{tokens}} before asking for approval. Include subject, sample message, why it should work, one concern or None, recommendation, and Open artifact: message-review.md. Keep tokenized template, token fill basis, rendered examples, good/bad token fill examples, validation notes, and message-validation.md details in artifacts. Do not show plain filesystem paths unless links cannot be created.",
655
656
  "allowedRecommendations": ["approve-message", "revise-messaging"],
656
657
  "judgeAgainst": [
657
658
  "generate-messages rules",
@@ -775,7 +776,7 @@
775
776
  "minimumVisibleDetail": "slim_final_approval_summary",
776
777
  "requiredArtifactLinks": ["approval-packet.md"],
777
778
  "artifactLinkTiming": "before_commit_gate_question",
778
- "chatRenderRule": "Show a slim final approval packet only. Include target with concrete role/title names, lead source with one key metric, filter summary, one fully filled sample message with no {{tokens}}, what approval creates, and safety note that nothing sends live until the review/greenlight step. Keep tokenized templates, evidence tables, rubrics, and validation details in approval-packet.md. Do not show sequence/settings in final approval; that comes after campaign creation. Do not show plain filesystem paths unless links cannot be created.",
779
+ "chatRenderRule": "Show a slim rendered-Markdown final approval packet only, never a fenced code block. Use ## Ready to create campaign plus indexed sections and short bullets. Include target with concrete role/title names, lead source with one key metric, filter summary, one fully filled sample message with no {{tokens}}, what approval creates, and safety note that nothing sends live until the review/greenlight step. Keep tokenized templates, evidence tables, rubrics, and validation details in approval-packet.md. Do not show sequence/settings in final approval; that comes after campaign creation. Do not show plain filesystem paths unless links cannot be created.",
779
780
  "userFacing": true,
780
781
  "doNotUseWords": ["anchor", "validation anchor", "lane"]
781
782
  },
@@ -874,7 +875,7 @@
874
875
  "what approval creates"
875
876
  ],
876
877
  "requiredArtifactLinks": ["approval-packet.md"],
877
- "chatRenderRule": "Same slim approval packet as approval-packet. Include target with concrete role/title names and one fully filled sample message without tokens. Do not include sequence/settings. Do not repeat tokenized template or long evidence tables in chat.",
878
+ "chatRenderRule": "Same slim rendered-Markdown approval packet as approval-packet, never a fenced code block. Use indexed sections and short bullets. Include target with concrete role/title names and one fully filled sample message without tokens. Do not include sequence/settings. Do not repeat tokenized template or long evidence tables in chat.",
878
879
  "artifactLinkTiming": "same_turn_before_commit_question"
879
880
  },
880
881
  {
@@ -133,7 +133,9 @@ directional range and label it `directional`, not definitive.
133
133
 
134
134
  `## Evidence Snapshot` and the visible lead-review chat must break estimates out
135
135
  by provider/source angle. Do not collapse everything into one raw count. Use
136
- one row or bullet per angle, for example:
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:
137
139
 
138
140
  - `Signals / AI outbound posts`
139
141
  - `Sales Nav / active SaaS founders + GTM leaders`