@sellable/mcp 0.1.144 → 0.1.146
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/README.md +14 -3
- package/agents/post-find-leads-message-scout.md +8 -14
- package/agents/source-scout-linkedin-engagement.md +4 -3
- package/agents/source-scout-prospeo-contact.md +1 -1
- package/agents/source-scout-sales-nav.md +3 -2
- package/dist/server.js +29 -59
- package/dist/tools/auth.js +5 -5
- package/dist/tools/leads.js +70 -14
- package/dist/tools/registry.d.ts +4186 -0
- package/dist/tools/registry.js +59 -0
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +10 -9
- package/skills/create-campaign-v2/SKILL.md +12 -6
- package/skills/create-campaign-v2/SOUL.md +6 -2
- package/skills/create-campaign-v2/core/auto-execute.README.md +4 -4
- package/skills/create-campaign-v2/core/auto-execute.yaml +4 -4
- package/skills/create-campaign-v2/core/flow.v2.json +27 -5
- package/skills/create-campaign-v2/references/approval-gate-framing.md +1 -1
- package/skills/create-campaign-v2/references/filter-leads.md +42 -0
- package/skills/create-campaign-v2/references/message-review-safety-gate.md +22 -44
- package/skills/create-campaign-v2/references/sample-validation-loop.md +13 -13
- package/skills/create-campaign-v2/references/step-13-import-leads.md +14 -9
- package/skills/create-campaign-v2/references/watch-guide-narration.md +2 -2
- package/skills/load-voice/SKILL.md +129 -0
- package/skills/providers/prospeo.md +2 -1
- package/skills/providers/sales-nav.md +4 -2
- package/skills/providers/signal-discovery.md +12 -10
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: load-voice
|
|
3
|
+
description: Load Sellable voice/company memory before answering questions, writing posts, applications, replies, or other copy in the user's voice.
|
|
4
|
+
visibility: public
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Glob
|
|
8
|
+
- Grep
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Load Sellable Voice
|
|
12
|
+
|
|
13
|
+
<role>
|
|
14
|
+
You are the Sellable voice loader. Your job is to read the user's durable
|
|
15
|
+
Sellable voice/company memory into the current thread before drafting,
|
|
16
|
+
answering, rewriting, reviewing, or calibrating copy in the user's voice.
|
|
17
|
+
|
|
18
|
+
This is a read-only usage workflow. Do not interview by default, do not write
|
|
19
|
+
memory files, and do not update `.sellable/**` unless the user explicitly asks
|
|
20
|
+
to switch into `$sellable:interview`.
|
|
21
|
+
</role>
|
|
22
|
+
|
|
23
|
+
<default_use_cases>
|
|
24
|
+
Use this workflow when the user asks to:
|
|
25
|
+
|
|
26
|
+
- answer questions on behalf of them
|
|
27
|
+
- write or rewrite a LinkedIn post
|
|
28
|
+
- answer an application, investor, customer, or sales question
|
|
29
|
+
- draft a sales reply, objection response, cold note, or website line
|
|
30
|
+
- review whether copy sounds like them
|
|
31
|
+
- "use my voice", "load my voice", "answer like me", or "write this as me"
|
|
32
|
+
</default_use_cases>
|
|
33
|
+
|
|
34
|
+
<load_order>
|
|
35
|
+
Read only relevant files. Start with the active `.sellable/configs` memory
|
|
36
|
+
layer, not random repo docs.
|
|
37
|
+
|
|
38
|
+
If `.sellable/configs` is not visible from the current working directory, use
|
|
39
|
+
`Glob` to find `**/.sellable/configs/core/my-company.md`, excluding
|
|
40
|
+
`node_modules`, `.next`, `dist`, and `.git`, then use the nearest parent as the
|
|
41
|
+
Sellable memory root.
|
|
42
|
+
|
|
43
|
+
## Core Voice And Judgment
|
|
44
|
+
|
|
45
|
+
Read these when present:
|
|
46
|
+
|
|
47
|
+
- `.sellable/configs/core/about-me.md`
|
|
48
|
+
- `.sellable/configs/core/anti-ai-writing-style.md`
|
|
49
|
+
- `.sellable/configs/core/decision-rules.md`
|
|
50
|
+
- `.sellable/configs/core/context-modes.md`
|
|
51
|
+
|
|
52
|
+
## Company Truth And Proof
|
|
53
|
+
|
|
54
|
+
Read these when present:
|
|
55
|
+
|
|
56
|
+
- `.sellable/configs/core/my-company.md`
|
|
57
|
+
- `.sellable/configs/core/answer-bank.md`
|
|
58
|
+
- `.sellable/configs/core/proof-ledger.md`
|
|
59
|
+
- `.sellable/configs/core/story-bank.md`
|
|
60
|
+
- `.sellable/configs/core/wins-ledger.md`
|
|
61
|
+
|
|
62
|
+
## Writing-Specific Guidance
|
|
63
|
+
|
|
64
|
+
Read these when present and relevant to the task:
|
|
65
|
+
|
|
66
|
+
- `.sellable/configs/writing/styleguide-core.md`
|
|
67
|
+
- `.sellable/configs/writing/comments.md`
|
|
68
|
+
|
|
69
|
+
## Transcript Or Topic Context
|
|
70
|
+
|
|
71
|
+
Do not bulk-read raw transcripts. If the user asks about a specific topic,
|
|
72
|
+
story, sales call, customer, market view, or correction, first read:
|
|
73
|
+
|
|
74
|
+
- `.sellable/configs/core/transcripts/INDEX.md`
|
|
75
|
+
- the most relevant file under `.sellable/configs/core/transcripts/topics/`
|
|
76
|
+
|
|
77
|
+
Only read raw archives under `.sellable/interviews/**` when the index/topic file
|
|
78
|
+
points to one and the current task needs that source detail.
|
|
79
|
+
</load_order>
|
|
80
|
+
|
|
81
|
+
<operating_rules>
|
|
82
|
+
|
|
83
|
+
- Keep the loader lightweight. The first pass should usually be 6-10 files, not
|
|
84
|
+
every file under `.sellable`.
|
|
85
|
+
- Apply the loaded profile silently after a short confirmation. Do not paste a
|
|
86
|
+
long summary of the memory unless the user asks for one.
|
|
87
|
+
- If the user already gave a concrete writing task, load the memory and then do
|
|
88
|
+
the task. Do not stop at "I loaded the files."
|
|
89
|
+
- If the user only asked to load voice, say what you loaded, name the strongest
|
|
90
|
+
active rules in 3-6 bullets, then ask what they want drafted, answered, or
|
|
91
|
+
reviewed.
|
|
92
|
+
- If exact proof, numbers, customer names, or timelines are not confirmed in
|
|
93
|
+
the loaded memory, preserve that uncertainty. Do not launder uncertain proof
|
|
94
|
+
into clean claims.
|
|
95
|
+
- Use the current `context-modes.md` behavior for the requested surface:
|
|
96
|
+
LinkedIn post, sales reply, website, investor/application answer, outbound, or
|
|
97
|
+
internal strategy.
|
|
98
|
+
- When answering on behalf of the user, write in first person unless the user
|
|
99
|
+
asks otherwise.
|
|
100
|
+
- If a question cannot be answered from memory, make the smallest honest
|
|
101
|
+
assumption or ask one specific follow-up. Do not invent private history,
|
|
102
|
+
metrics, customer facts, or beliefs.
|
|
103
|
+
- If the user says the output is wrong, ask what feels off and accept messy
|
|
104
|
+
dictated notes. Use that correction in the current thread. If they want the
|
|
105
|
+
correction saved durably, route them to `$sellable:interview`.
|
|
106
|
+
</operating_rules>
|
|
107
|
+
|
|
108
|
+
<response_shape>
|
|
109
|
+
After loading memory, use this shape when there is no concrete draft task yet:
|
|
110
|
+
|
|
111
|
+
```text
|
|
112
|
+
I loaded your Sellable voice/company memory from {n} files. I’ll apply it
|
|
113
|
+
silently unless you override it.
|
|
114
|
+
|
|
115
|
+
The active rules I’m carrying forward:
|
|
116
|
+
- ...
|
|
117
|
+
|
|
118
|
+
What should I answer, write, or review?
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
When there is already a concrete task, keep the confirmation to one sentence,
|
|
122
|
+
then produce the answer or draft.
|
|
123
|
+
</response_shape>
|
|
124
|
+
|
|
125
|
+
<quality_bar>
|
|
126
|
+
The result should feel like the user has a standing voice file in the thread:
|
|
127
|
+
specific, current, proof-safe, and ready to answer on their behalf without
|
|
128
|
+
forcing them to re-explain the same voice/company context every time.
|
|
129
|
+
</quality_bar>
|
|
@@ -62,7 +62,8 @@ search_prospeo({
|
|
|
62
62
|
- Pass `searchId` on subsequent pages to paginate.
|
|
63
63
|
- Use `import_leads` with `provider: \"prospeo\"` and the `searchId` to create a lead list and start import.
|
|
64
64
|
- **IMPORTANT:** If `import_leads` returns `needsModeSelection: true`, use `AskUserQuestion` to ask "add to existing leads or replace?" Do NOT assume.
|
|
65
|
-
-
|
|
65
|
+
- Default source target is 300+ good-fit leads, capped at 2,500 source candidates for now.
|
|
66
|
+
- After the list finishes and the user confirms it looks good, call `confirm_lead_list` with the `jobId` and the review-batch `targetLeadCount` from the active campaign defaults to import only the review batch into the campaign table.
|
|
66
67
|
- `import_leads` owns the watched move to `confirm-lead-list` after a lead list/job exists.
|
|
67
68
|
- `confirm_lead_list` owns the watched move to `filter-choice` after the bounded review batch exists.
|
|
68
69
|
- Post-confirm readback order is required:
|
|
@@ -349,9 +349,9 @@ Step 4 - Final Search + Confirm:
|
|
|
349
349
|
What would you like?"
|
|
350
350
|
|
|
351
351
|
User: "Save it"
|
|
352
|
-
→ import_leads({campaignOfferId: "cmp_xxx", searchId: "search_xxx", targetLeadCount:
|
|
352
|
+
→ import_leads({campaignOfferId: "cmp_xxx", searchId: "search_xxx", targetLeadCount: 300})
|
|
353
353
|
→ (wait for lead list to finish, ask user to confirm)
|
|
354
|
-
→ confirm_lead_list({campaignOfferId: "cmp_xxx", jobId: "<jobId from import_leads>", targetLeadCount:
|
|
354
|
+
→ confirm_lead_list({campaignOfferId: "cmp_xxx", jobId: "<jobId from import_leads>", targetLeadCount: 25})
|
|
355
355
|
→ wait_for_campaign_table_ready({campaignId: "cmp_xxx"})
|
|
356
356
|
→ get_campaign_context({campaignId: "cmp_xxx", refresh: true}) + get_rows_minimal(...)
|
|
357
357
|
</iteration_example>
|
|
@@ -382,6 +382,8 @@ User: "Save it"
|
|
|
382
382
|
<limits>
|
|
383
383
|
- 25 results per page
|
|
384
384
|
- Maximum 100 pages (2,500 leads)
|
|
385
|
+
- Default source target: 300+ good-fit leads, capped at 2,500 source
|
|
386
|
+
candidates for now
|
|
385
387
|
- Maximum 5 search calls per session
|
|
386
388
|
- If user needs more than 2,500: explain limit, suggest splitting by region
|
|
387
389
|
</limits>
|
|
@@ -98,11 +98,12 @@ You must estimate:
|
|
|
98
98
|
- expected good-fit prospects per right-content post after dedupe/cleanup
|
|
99
99
|
- `postsNeededForTarget`
|
|
100
100
|
- number of right-content posts needed to reach the target good-fit lead
|
|
101
|
-
count, defaulting to
|
|
101
|
+
count, defaulting to 150 for Signal Discovery unless the campaign says
|
|
102
|
+
otherwise
|
|
102
103
|
- `requiredEngagersToScrape`
|
|
103
|
-
- `ceil(targetGoodFitLeads / sampledFitRate)`; for example
|
|
104
|
-
prospects per 100 engagers means a
|
|
105
|
-
1,
|
|
104
|
+
- `ceil(targetGoodFitLeads / sampledFitRate)`; for example 15 good-fit
|
|
105
|
+
prospects per 100 engagers means a 150-good-fit source target needs about
|
|
106
|
+
1,000 engagers scraped
|
|
106
107
|
- `projectedRange`
|
|
107
108
|
- the conservative range implied by the observed sample
|
|
108
109
|
|
|
@@ -126,7 +127,7 @@ Use conservative logic:
|
|
|
126
127
|
- stale posts
|
|
127
128
|
- adjacent communities that are not actual buyers
|
|
128
129
|
4. Explain the pass-through briefly and explicitly:
|
|
129
|
-
- preferred: "`sampledCount`: 40, `passCount`: 9, `passRate`: ~22%, `goodFitPer100Engagers`: ~22 before cleanup / ~13-16 after cleanup, `requiredEngagersToScrape`: ~1,
|
|
130
|
+
- preferred: "`sampledCount`: 40, `passCount`: 9, `passRate`: ~22%, `goodFitPer100Engagers`: ~22 before cleanup / ~13-16 after cleanup, `requiredEngagersToScrape`: ~940-1,150 for a 150-good-fit target after cleanup, `avgReachableEngagersPerPost`: 240, `goodFitProspectsPerPost`: ~31-38, `postsNeededForTarget`: ~4-5, `recentStrongPostCount`: 15-25, `freshEnoughPostCount`: 8-12, `projectedRange`: 150-190 from selected posts"
|
|
130
131
|
- fallback: "I could not fetch engagers, so this is inferred from post and author quality only"
|
|
131
132
|
5. If the evidence is too weak, say so and return a low-confidence estimate instead of pretending precision.
|
|
132
133
|
6. Do not manually enumerate dozens of engagers in the final answer. Summarize the sample by `sampledCount`, `passCount`, `passRate`, `projectedRange`, and 3-6 representative examples.
|
|
@@ -378,7 +379,8 @@ For `create-campaign-v2` source approval, do not treat the default
|
|
|
378
379
|
`selectionTarget` of 3 posts as enough by itself. Before the final source
|
|
379
380
|
recommendation, estimate source capacity from real sample math:
|
|
380
381
|
|
|
381
|
-
- source target good-fit leads (default
|
|
382
|
+
- source target good-fit leads (default 150 for Signal Discovery unless the
|
|
383
|
+
campaign says otherwise)
|
|
382
384
|
- eligible right-content posts by lane/content type
|
|
383
385
|
- reachable engagers from those posts
|
|
384
386
|
- sampled ICP-fit rate as `n/N` plus an easy percentage/range
|
|
@@ -447,7 +449,7 @@ selections, headlineICPCriteria })`, then call
|
|
|
447
449
|
targetLeadCount, targetEngagerCount, maxPostsToScrape })` for the approved
|
|
448
450
|
source-capacity plan without asking for another yes/no gate. Then
|
|
449
451
|
`confirm_lead_list` imports only the bounded review batch into the campaign
|
|
450
|
-
table. Do not confuse the source
|
|
452
|
+
table. Do not confuse the source-candidate target with the review-batch size.
|
|
451
453
|
|
|
452
454
|
The promotion/select step is required campaign state. Use post IDs from the
|
|
453
455
|
current campaign-scoped search result, not stale IDs copied from a source review
|
|
@@ -460,8 +462,8 @@ the source-list materialization.
|
|
|
460
462
|
```json
|
|
461
463
|
import_leads({
|
|
462
464
|
"campaignOfferId": "cmp_xxx",
|
|
463
|
-
"targetLeadCount":
|
|
464
|
-
"targetEngagerCount":
|
|
465
|
+
"targetLeadCount": 1000,
|
|
466
|
+
"targetEngagerCount": 1000,
|
|
465
467
|
"maxPostsToScrape": 5
|
|
466
468
|
})
|
|
467
469
|
```
|
|
@@ -474,7 +476,7 @@ After the lead list finishes and the user confirms it looks good, call:
|
|
|
474
476
|
confirm_lead_list({
|
|
475
477
|
"campaignOfferId": "cmp_xxx",
|
|
476
478
|
"jobId": "<jobId from import_leads>",
|
|
477
|
-
"targetLeadCount":
|
|
479
|
+
"targetLeadCount": 25
|
|
478
480
|
})
|
|
479
481
|
```
|
|
480
482
|
|