@sellable/mcp 0.1.257 → 0.1.259
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/dist/index-dev.js +0 -0
- package/dist/index.js +0 -0
- package/dist/server.js +4 -1
- package/dist/tools/csv-dnc.d.ts +36 -0
- package/dist/tools/csv-dnc.js +94 -2
- package/dist/tools/engage-discovery.d.ts +0 -21
- package/dist/tools/engage-discovery.js +9 -136
- package/dist/tools/leads.d.ts +381 -21
- package/dist/tools/leads.js +219 -5
- package/dist/tools/registry.d.ts +207 -23
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +6 -0
- package/skills/create-campaign-v2/references/filter-leads.md +2 -0
- package/skills/create-campaign-v2/references/lead-validation-preview.md +2 -0
- package/skills/create-campaign-v2/references/step-13-import-leads.md +3 -1
- package/skills/create-post/SKILL.md +21 -67
- package/skills/create-post/references/gold-standard-post-pack.md +0 -11
- package/skills/create-post/references/hook-research-playbook.md +15 -205
- package/skills/create-post/references/post-file-contract.md +0 -12
- package/skills/create-post/references/post-validation.md +14 -101
- package/skills/find-leads/SKILL.md +6 -0
- package/skills/create-post/references/linkedin-preview-rendering.md +0 -163
- package/skills/research/config.json +0 -9
|
@@ -11,7 +11,6 @@ Every saved draft needs a validation receipt. A draft without this receipt is no
|
|
|
11
11
|
- `candidateHooksConsidered`
|
|
12
12
|
- `selectedHook`
|
|
13
13
|
- `selectedHookWhy`
|
|
14
|
-
- `sourceHookReachAudit`
|
|
15
14
|
- `proofClaimsUsed`
|
|
16
15
|
- `proofClaimSources`
|
|
17
16
|
- `storyFilesConsulted`
|
|
@@ -78,17 +77,7 @@ Each candidate should include:
|
|
|
78
77
|
- premise tension opened
|
|
79
78
|
- reader value implied
|
|
80
79
|
- source pattern
|
|
81
|
-
- source pattern reach signals: author follower count when available, target
|
|
82
|
-
follower band, follower-band fit, engagement per 1k followers, weighted
|
|
83
|
-
engagement per 1k followers, reach-adjusted score, baseline lift, and
|
|
84
|
-
confidence
|
|
85
80
|
- score
|
|
86
|
-
- `renderedPreview` using `references/linkedin-preview-rendering.md`
|
|
87
|
-
- literal mobile and desktop rendered preview blocks
|
|
88
|
-
- mobile and desktop rendered line wraps
|
|
89
|
-
- first-screen promise: pain, proof, or curiosity visible by the mobile clamp
|
|
90
|
-
- whether the core point is visible in the mobile rendered preview
|
|
91
|
-
- whether the point lands after the mobile clamp
|
|
92
81
|
- char count including newlines and first-line / first-two-line preview measurements
|
|
93
82
|
- physical line count, content line count, longest nonblank line, and blank-line risk
|
|
94
83
|
- `previewBudgetStatus`: `pass`, `warn`, or `fail`
|
|
@@ -109,7 +98,7 @@ After the first draft:
|
|
|
109
98
|
6. replace generic language with concrete words only when supported
|
|
110
99
|
7. preserve the user's actual story and point
|
|
111
100
|
8. remove AI tells
|
|
112
|
-
9. re-
|
|
101
|
+
9. re-check LinkedIn preview fit after edits
|
|
113
102
|
|
|
114
103
|
## Premise Value Audit
|
|
115
104
|
|
|
@@ -158,96 +147,24 @@ If `selectedControversy` is missing, if the audience belief is only a generic
|
|
|
158
147
|
label like "founders want growth," or if `credibleWhyUs` depends on borrowed
|
|
159
148
|
proof from another creator, save as `needs_revision`.
|
|
160
149
|
|
|
161
|
-
##
|
|
162
|
-
|
|
163
|
-
Before a draft can be `ready`, validate that the selected source hook pattern
|
|
164
|
-
was chosen for a reach-normalized reason, not raw audience size.
|
|
165
|
-
|
|
166
|
-
Record:
|
|
150
|
+
## LinkedIn Preview Audit
|
|
167
151
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
- `engagementPer1kFollowers`
|
|
173
|
-
- `weightedEngagementPer1kFollowers`
|
|
174
|
-
- `reachAdjustedScore`
|
|
175
|
-
- `reachPenaltyMultiplier`
|
|
176
|
-
- `creatorBaselineMedianEngagement` or `creator_baseline_unavailable`
|
|
177
|
-
- `baselineLift` or `creator_baseline_unavailable`
|
|
178
|
-
- `bigAccountPenaltyApplied`
|
|
179
|
-
- `whyTheHookCarries`
|
|
180
|
-
- `followerCountUnavailableSources`
|
|
181
|
-
- `whyThisHookIsAReachAdjustedSignal`
|
|
182
|
-
|
|
183
|
-
If the user asked for a follower range and the selected source pattern is from a
|
|
184
|
-
large account above the target range, the receipt must explain why it survived
|
|
185
|
-
the celebrity reach penalty. Use large-account hooks as secondary pattern
|
|
186
|
-
evidence unless they clearly overperform the creator's baseline or the hook
|
|
187
|
-
itself carries after reach is controlled. A draft cannot be `ready` when the
|
|
188
|
-
selected hook is justified only by raw total engagement or follower count.
|
|
152
|
+
Audit the selected hook and top candidates against conservative LinkedIn
|
|
153
|
+
preview budgets. LinkedIn does not publish exact "see more" cutoff rules, and
|
|
154
|
+
rendering varies by device, app version, font, media, and line break. This audit
|
|
155
|
+
is a mobile-first safety gate, not a claim about an official LinkedIn limit.
|
|
189
156
|
|
|
190
|
-
|
|
157
|
+
Use:
|
|
191
158
|
|
|
192
|
-
|
|
193
|
-
`
|
|
194
|
-
|
|
195
|
-
media, and line break. This audit is a mobile-first rendered-preview safety
|
|
196
|
-
gate, not a claim about an official LinkedIn limit.
|
|
197
|
-
|
|
198
|
-
Character budgets are secondary diagnostics. They cannot be the only evidence
|
|
199
|
-
that a hook works. Every selected hook must include literal rendered mobile and
|
|
200
|
-
desktop preview blocks.
|
|
201
|
-
|
|
202
|
-
Default deterministic renderer when no authenticated LinkedIn screenshot is
|
|
203
|
-
available:
|
|
204
|
-
|
|
205
|
-
```text
|
|
206
|
-
cssContractVersion: linkedin-preview-rendering/v1
|
|
207
|
-
font size: 14px
|
|
208
|
-
line height: 21px
|
|
209
|
-
white space: pre-wrap
|
|
210
|
-
overflow wrap: break-word
|
|
211
|
-
mobile text width: 308px
|
|
212
|
-
desktop text width: 582px
|
|
213
|
-
review clamp: first 3 rendered text lines
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
Use rendered gates:
|
|
217
|
-
|
|
218
|
-
- `pass`: the mobile rendered preview shows the pain, proof, or curiosity by
|
|
219
|
-
the end of the first 3 rendered lines, and the core point is understandable
|
|
220
|
-
without opening "see more".
|
|
221
|
-
- `warn`: the mobile rendered preview creates useful curiosity but the core
|
|
222
|
-
point is slightly softened by wrapping, blank-line rhythm, or one missing
|
|
223
|
-
context word. A compact fallback is required.
|
|
224
|
-
- `fail`: the hook's real point appears after the first 3 mobile rendered
|
|
225
|
-
lines, the first rendered line is generic setup, blank lines consume the
|
|
226
|
-
preview before the reader sees the point, or desktop fit is the only reason it
|
|
227
|
-
looks good.
|
|
159
|
+
- `pass`: hook is <= 110 chars including newlines, every nonblank line is <= 45 chars, and the hook's core point lands before likely truncation.
|
|
160
|
+
- `warn`: hook is 111-140 chars including newlines, any nonblank line is 46-55 chars, or blank lines create visual-line risk. Blank lines are allowed, but they count as physical lines.
|
|
161
|
+
- `fail`: hook is > 140 chars including newlines, any nonblank line is > 55 chars, or the hook's point depends on text after likely truncation.
|
|
228
162
|
|
|
229
163
|
Desktop preview usually has more room. Still record desktop fit, but never let
|
|
230
164
|
desktop fit compensate for a mobile `fail`.
|
|
231
165
|
|
|
232
166
|
Record:
|
|
233
167
|
|
|
234
|
-
- `renderedPreview`
|
|
235
|
-
- `renderBasis`: `linkedin_css_contract`, `authenticated_linkedin_screenshot`,
|
|
236
|
-
or `manual_user_source`
|
|
237
|
-
- `cssContractVersion`
|
|
238
|
-
- `mobileRenderedPreviewBlock`
|
|
239
|
-
- `desktopRenderedPreviewBlock`
|
|
240
|
-
- `mobileRenderedLines`
|
|
241
|
-
- `desktopRenderedLines`
|
|
242
|
-
- `mobileTextWidthPx`
|
|
243
|
-
- `desktopTextWidthPx`
|
|
244
|
-
- `mobileRenderedLineCount`
|
|
245
|
-
- `desktopRenderedLineCount`
|
|
246
|
-
- `corePainProofOrCuriosityVisibleMobile`
|
|
247
|
-
- `corePainProofOrCuriosityVisibleDesktop`
|
|
248
|
-
- `corePointVisibleMobile`
|
|
249
|
-
- `corePointVisibleDesktop`
|
|
250
|
-
- `pointAfterMobileClamp`
|
|
251
168
|
- `charCount`
|
|
252
169
|
- `charCountIncludingNewlines`
|
|
253
170
|
- `firstLineChars`
|
|
@@ -266,14 +183,10 @@ Record:
|
|
|
266
183
|
- `rewriteIfTruncated`
|
|
267
184
|
- `compactFallback` when `previewBudgetStatus` is `warn`
|
|
268
185
|
|
|
269
|
-
If the hook only works after
|
|
270
|
-
|
|
271
|
-
`
|
|
272
|
-
|
|
273
|
-
`corePointVisibleMobile: false`, or `pointAfterMobileClamp: true`. A draft may
|
|
274
|
-
be `ready` with `previewBudgetStatus: warn` only when the warning is explicit,
|
|
275
|
-
usually because the user prefers blank-line rhythm, and the receipt includes a
|
|
276
|
-
compact fallback.
|
|
186
|
+
If the hook only works after likely truncation, rewrite it. A draft cannot be
|
|
187
|
+
`ready` with `previewBudgetStatus: fail`. A draft may be `ready` with
|
|
188
|
+
`previewBudgetStatus: warn` only when the warning is explicit, usually because
|
|
189
|
+
the user prefers blank-line rhythm, and the receipt includes a compact fallback.
|
|
277
190
|
|
|
278
191
|
## Simplifier / Concrete-Language Audit
|
|
279
192
|
|
|
@@ -90,6 +90,7 @@ should stay focused on source evidence.
|
|
|
90
90
|
- `mcp__sellable__search_prospeo`
|
|
91
91
|
- `mcp__sellable__search_prospeo_companies`
|
|
92
92
|
- `mcp__sellable__confirm_prospeo_company_accounts`
|
|
93
|
+
- `mcp__sellable__list_dnc_entries`
|
|
93
94
|
- `mcp__sellable__load_csv_dnc_entries`
|
|
94
95
|
- `mcp__sellable__load_csv_domains`
|
|
95
96
|
- `mcp__sellable__load_csv_linkedin_leads`
|
|
@@ -105,6 +106,9 @@ should stay focused on source evidence.
|
|
|
105
106
|
list after confirming the exact active workspace. Keep the mechanism to
|
|
106
107
|
Sellable DNC and `DNC Check`, not provider search work or Prospeo domain
|
|
107
108
|
filters.
|
|
109
|
+
- If the user asks to see the current DNC count, list names, or first page
|
|
110
|
+
before import, call `list_dnc_entries`. Report the active workspace name and
|
|
111
|
+
ID from the tool response before any DNC write.
|
|
108
112
|
- Do not infer sender identities from meeting attendance alone. Only treat someone as a sender when the source material explicitly identifies them as a sender or supplies their LinkedIn URL.
|
|
109
113
|
- Do not ask Layer 1 questions already answered by a transcript, ICP doc, or Layer 0 research.
|
|
110
114
|
- Do not include Apollo in the explorer set for this phase.
|
|
@@ -136,6 +140,8 @@ Execution flow:
|
|
|
136
140
|
DNC entries.
|
|
137
141
|
- Campaign creation already includes `DNC Check`, which checks domain/profile
|
|
138
142
|
before message generation.
|
|
143
|
+
- If the user wants the existing DNC count or first page first, call
|
|
144
|
+
`list_dnc_entries` before previewing the import.
|
|
139
145
|
3. If the user has a CSV of LinkedIn profile URLs on disk, call `load_csv_linkedin_leads` first.
|
|
140
146
|
- Preview, confirm, then review the resulting lead list before `confirm_lead_list`.
|
|
141
147
|
- Confirmed execution uploads the raw CSV file, starts the server-owned import job, and waits on lead-list readiness before returning.
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
# LinkedIn Preview Rendering
|
|
2
|
-
|
|
3
|
-
This asset defines the required rendered-preview contract for create-post hook
|
|
4
|
-
research, hook candidate generation, gold-standard decomposition, and draft
|
|
5
|
-
validation.
|
|
6
|
-
|
|
7
|
-
Character budgets are only diagnostics. They are not the preview gate. A hook is
|
|
8
|
-
not studied, selected, or ready until it has been rendered through this contract
|
|
9
|
-
or through a stricter authenticated LinkedIn screenshot.
|
|
10
|
-
|
|
11
|
-
## Rendering Basis
|
|
12
|
-
|
|
13
|
-
LinkedIn does not publish exact feed truncation rules, and rendering can vary by
|
|
14
|
-
surface, app version, device, media attachment, and account state. Use this
|
|
15
|
-
deterministic renderer as the MCP review gate for unpublished drafts.
|
|
16
|
-
|
|
17
|
-
When an authenticated LinkedIn feed/composer/browser screenshot is available,
|
|
18
|
-
that screenshot is the strongest evidence. Still record the fields below so
|
|
19
|
-
future agents can compare candidates without redoing the visual inspection.
|
|
20
|
-
|
|
21
|
-
Observed public LinkedIn post text style for feed-style post pages:
|
|
22
|
-
|
|
23
|
-
```text
|
|
24
|
-
selector basis: p.attributed-text-segment-list__content
|
|
25
|
-
font family: -apple-system, system-ui, "Segoe UI", Roboto, "Helvetica Neue",
|
|
26
|
-
"Fira Sans", Ubuntu, "Oxygen Sans", Cantarell, "Droid Sans",
|
|
27
|
-
"Lucida Grande", Helvetica, Arial, sans-serif
|
|
28
|
-
font size: 14px
|
|
29
|
-
line height: 21px
|
|
30
|
-
font weight: 400
|
|
31
|
-
letter spacing: normal
|
|
32
|
-
white space: pre-wrap
|
|
33
|
-
overflow wrap: break-word
|
|
34
|
-
text color: rgba(0, 0, 0, 0.9)
|
|
35
|
-
mobile text width: 308px
|
|
36
|
-
desktop text width: 582px
|
|
37
|
-
review clamp: first 3 rendered text lines
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
The `review clamp` is not an official LinkedIn rule. It is the conservative
|
|
41
|
-
apples-to-apples region create-post must use when comparing hooks. Do not let a
|
|
42
|
-
desktop pass rescue a mobile fail.
|
|
43
|
-
|
|
44
|
-
## Required Rendering Record
|
|
45
|
-
|
|
46
|
-
Every shortlisted source hook, adapted hook block, generated hook candidate, and
|
|
47
|
-
selected hook must include a `renderedPreview` record:
|
|
48
|
-
|
|
49
|
-
```text
|
|
50
|
-
renderedPreview:
|
|
51
|
-
basis: linkedin_css_contract | authenticated_linkedin_screenshot | manual_user_source
|
|
52
|
-
cssContractVersion: linkedin-preview-rendering/v1
|
|
53
|
-
mobile:
|
|
54
|
-
textWidthPx: 308
|
|
55
|
-
fontSizePx: 14
|
|
56
|
-
lineHeightPx: 21
|
|
57
|
-
visibleTextBlock: <literal first rendered review-clamp block>
|
|
58
|
-
renderedLines:
|
|
59
|
-
- <line 1 exactly as wrapped>
|
|
60
|
-
- <line 2 exactly as wrapped>
|
|
61
|
-
- <line 3 exactly as wrapped>
|
|
62
|
-
lineCountBeforeClamp: <number>
|
|
63
|
-
blankLinesBeforeClamp: <number>
|
|
64
|
-
corePainProofOrCuriosityVisible: true | false
|
|
65
|
-
corePointVisible: true | false
|
|
66
|
-
seeMoreRisk: pass | warn | fail
|
|
67
|
-
screenshotPath: <optional local path>
|
|
68
|
-
desktop:
|
|
69
|
-
textWidthPx: 582
|
|
70
|
-
fontSizePx: 14
|
|
71
|
-
lineHeightPx: 21
|
|
72
|
-
visibleTextBlock: <literal first rendered review-clamp block>
|
|
73
|
-
renderedLines:
|
|
74
|
-
- <line 1 exactly as wrapped>
|
|
75
|
-
- <line 2 exactly as wrapped>
|
|
76
|
-
- <line 3 exactly as wrapped>
|
|
77
|
-
lineCountBeforeClamp: <number>
|
|
78
|
-
blankLinesBeforeClamp: <number>
|
|
79
|
-
corePainProofOrCuriosityVisible: true | false
|
|
80
|
-
corePointVisible: true | false
|
|
81
|
-
seeMoreRisk: pass | warn | fail
|
|
82
|
-
screenshotPath: <optional local path>
|
|
83
|
-
diagnostics:
|
|
84
|
-
charCount: <number>
|
|
85
|
-
charCountIncludingNewlines: <number>
|
|
86
|
-
firstLineChars: <number>
|
|
87
|
-
firstTwoPhysicalLinesChars: <number>
|
|
88
|
-
longestNonblankLineChars: <number>
|
|
89
|
-
blankLineVisualRisk: none | low | medium | high
|
|
90
|
-
pointAfterMobileClamp: true | false
|
|
91
|
-
rewriteIfTruncated: <short fallback>
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
If a host cannot produce screenshots, it must still produce the literal wrapped
|
|
95
|
-
line blocks using the CSS contract. If it cannot produce either screenshots or
|
|
96
|
-
literal line wraps, return `blocked` or `needs_revision`; do not claim the hook
|
|
97
|
-
passed preview validation from character counts alone.
|
|
98
|
-
|
|
99
|
-
## Study Rules
|
|
100
|
-
|
|
101
|
-
For source-post research:
|
|
102
|
-
|
|
103
|
-
- Render the exact visible opening from full text when full text is available.
|
|
104
|
-
- If only a search preview is available, render only the preview text and set
|
|
105
|
-
`basis: manual_user_source` or record `sourceTextBasis: search_preview`.
|
|
106
|
-
- Lower confidence when the search preview is cut off or the body is
|
|
107
|
-
unavailable.
|
|
108
|
-
- Extract hook lessons from the rendered first-screen experience, not from the
|
|
109
|
-
full post in isolation.
|
|
110
|
-
|
|
111
|
-
For generated hooks:
|
|
112
|
-
|
|
113
|
-
- Generate the hook from the selected premise first.
|
|
114
|
-
- Render the hook for mobile and desktop before scoring it.
|
|
115
|
-
- Score the rendered first-screen promise before scoring cleverness.
|
|
116
|
-
- Rewrite any candidate whose real point appears after the mobile clamp.
|
|
117
|
-
|
|
118
|
-
## Pass, Warn, Fail
|
|
119
|
-
|
|
120
|
-
Use these rendered gates:
|
|
121
|
-
|
|
122
|
-
- `pass`: the mobile rendered preview shows the pain, proof, or curiosity by the
|
|
123
|
-
end of the first 3 rendered lines, and the core point is understandable
|
|
124
|
-
without opening "see more".
|
|
125
|
-
- `warn`: the mobile rendered preview creates useful curiosity but the core
|
|
126
|
-
point is slightly softened by wrapping, blank-line rhythm, or one missing
|
|
127
|
-
context word. A compact fallback is required.
|
|
128
|
-
- `fail`: the hook's real point appears after the first 3 mobile rendered lines,
|
|
129
|
-
the first rendered line is generic setup, blank lines consume the preview
|
|
130
|
-
before the reader sees the point, or desktop fit is the only reason it looks
|
|
131
|
-
good.
|
|
132
|
-
|
|
133
|
-
A draft cannot be `ready` when the selected hook has:
|
|
134
|
-
|
|
135
|
-
- no `renderedPreview`
|
|
136
|
-
- `mobile.seeMoreRisk: fail`
|
|
137
|
-
- `mobile.corePainProofOrCuriosityVisible: false`
|
|
138
|
-
- `mobile.corePointVisible: false`
|
|
139
|
-
- `pointAfterMobileClamp: true`
|
|
140
|
-
|
|
141
|
-
## Report Format
|
|
142
|
-
|
|
143
|
-
Research reports must show rendered preview blocks for the best examples and
|
|
144
|
-
recommended draft directions:
|
|
145
|
-
|
|
146
|
-
```text
|
|
147
|
-
Rendered preview:
|
|
148
|
-
mobile:
|
|
149
|
-
<line 1>
|
|
150
|
-
<line 2>
|
|
151
|
-
<line 3>
|
|
152
|
-
|
|
153
|
-
desktop:
|
|
154
|
-
<line 1>
|
|
155
|
-
<line 2>
|
|
156
|
-
<line 3>
|
|
157
|
-
|
|
158
|
-
verdict: pass | warn | fail
|
|
159
|
-
why: <what is visible before the fold>
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
Do not say "it fits on mobile" without showing what the mobile reader actually
|
|
163
|
-
sees.
|