@sellable/mcp 0.1.239 → 0.1.240

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.239",
3
+ "version": "0.1.240",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -82,6 +82,7 @@ Use these MCP tools when available:
82
82
  - `mcp__sellable__fetch_linkedin_posts`
83
83
  - `mcp__sellable__fetch_linkedin_profile`
84
84
  - `mcp__sellable__record_engage_proven_search`
85
+ - `mcp__sellable__upsert_engage_tracked_person`
85
86
 
86
87
  Do not call outbound/campaign tools from this skill. Do not call message-generation prompts or tools. This skill reuses the quality architecture of the message pipeline: required assets, candidate set, finalizer pass, simplifier/concrete-language audit, anti-AI audit, proof/voice validation, and blocked/retry-needed states.
87
88
  </tools>
@@ -131,6 +132,8 @@ Durable write-back targets:
131
132
  - `core/transcripts/INDEX.md` for source interview or voice-memo references
132
133
  - `core/references/linkedin-posts/INDEX.md` and adjacent files for approved
133
134
  gold-standard post references
135
+ - `discovery/influencers.md` for approved creators/persons the user wants the
136
+ system to keep learning from
134
137
 
135
138
  Write-backs must use stable source keys such as
136
139
  `create-post:{date}:{ideaId}:{slug}` or
@@ -139,6 +142,13 @@ paths before adding references, create no duplicate reference rows, and keep
139
142
  manual sections preserved. If the user says to mark private, store only the
140
143
  minimum private-safe metadata and do not promote it into public proof,
141
144
  references, or examples.
145
+
146
+ When the user says a creator/person is worth following, learning from, or using
147
+ again, persist them with `mcp__sellable__upsert_engage_tracked_person` before
148
+ continuing. Use the canonical LinkedIn profile URL, a concise reason that names
149
+ the content lane, and no senderId unless the user explicitly scopes the person
150
+ to one sender. If the person is already tracked, update the reason instead of
151
+ creating a duplicate.
142
152
  </memory_contract>
143
153
 
144
154
  <modes>
@@ -173,6 +183,29 @@ Normal ad hoc mode still creates an ID'd idea artifact first with `mcp__sellable
173
183
 
174
184
  If the user explicitly says not to save anything, label the output `unsaved_preview`, do not call it draft-ready, and do not mark it as validated for publishing.
175
185
 
186
+ ## Research Checkpoint Mode
187
+
188
+ Use when the user asks to research hooks, research bodies, "show me what it
189
+ learned", "run the research phase", "what is working in the space", or anything
190
+ similar.
191
+
192
+ 1. Capture or load the idea/topic if one is provided.
193
+ 2. Run the hook/body research playbook.
194
+ 3. Save the research with `mcp__sellable__save_hook_research`.
195
+ 4. Present a `Research Learning Report` to the user.
196
+ 5. Do not draft until the user approves a direction or explicitly says to run
197
+ the draft phase.
198
+
199
+ The report must include specific words, phrase shapes, sentence patterns, and
200
+ body moves from the research. Do not only report abstract labels like
201
+ "contrarian hook" or "tool-stack enemy."
202
+
203
+ When the host supports background agents or Task workers, run the heavy research
204
+ in a dedicated research worker so the main orchestrator stays clean. The
205
+ orchestrator should keep only the compressed research packet, final selected
206
+ examples, and user-facing learning report in context. Do not paste the entire
207
+ raw source-post corpus into the orchestrator conversation.
208
+
176
209
  ## Gold Standard Pack Mode
177
210
 
178
211
  Use when the user asks to import their best posts, research best posts in the space, build a gold-standard pack, or add inspiration examples.
@@ -193,8 +226,11 @@ Space benchmark research:
193
226
  1. Use `mcp__sellable__search_engagement_posts` and the hook research playbook.
194
227
  2. Shortlist high-performing posts from the user's space using the weighted signal rules.
195
228
  3. Penalize lead magnets, giveaways, engagement bait, celebrity-only reach, and poor voice fit.
196
- 4. Show the user the candidates and ask: "These look good. Should we use any as gold standards?"
197
- 5. Add only the user-approved selections.
229
+ 4. When a creator/person appears repeatedly strong, include a `track_person`
230
+ recommendation in the candidate card.
231
+ 5. Show the user the candidates and ask: "These look good. Should we use any as gold standards or track any of these people?"
232
+ 6. Add only the user-approved post selections.
233
+ 7. For each approved tracked person, call `mcp__sellable__upsert_engage_tracked_person`.
198
234
 
199
235
  The approved pack is capped at 20 gold standards. If adding new approved examples would exceed 20, ask which existing item to replace or skip the overflow. Candidate lists can be longer, but approved saved standards cannot exceed 20.
200
236
  </modes>
@@ -220,6 +256,27 @@ If local idea capture succeeds but auth/workspace is missing, keep the idea and
220
256
 
221
257
  Use `references/hook-research-playbook.md`.
222
258
 
259
+ If the host supports background agents, delegate the search/fetch/autopsy work
260
+ to one bounded `research-worker` before hook candidate generation. The worker
261
+ owns broad search, profile fetches, full-text matching, source filtering,
262
+ language extraction, and body-structure extraction. The orchestrator owns the
263
+ final save call, user-visible `Research Learning Report`, direction selection,
264
+ and drafting gate.
265
+
266
+ The research worker must return a compact packet only:
267
+
268
+ - source examples kept and rejected
269
+ - full adapted hook blocks
270
+ - exact phrase patterns and sentence shapes
271
+ - body structures and exact body language moves
272
+ - preview measurements
273
+ - track-person and gold-standard recommendations
274
+ - blocked states or confidence gaps
275
+
276
+ The research worker must not return all raw post bodies unless a specific full
277
+ text is required as a gold-standard candidate. Prefer summaries plus URLs and
278
+ the exact extracted phrase shapes.
279
+
223
280
  Default flow:
224
281
 
225
282
  1. Convert the idea into 3-8 search keywords.
@@ -230,7 +287,8 @@ Default flow:
230
287
  6. Weigh shares/reposts above comments, comments above reactions, and reactions as weak reach unless paired with stronger signals. If shares/reposts are unavailable, record `repost_data_unavailable`.
231
288
  7. Penalize lead-magnet or giveaway mechanics unless the user explicitly asks for a lead magnet post.
232
289
  8. For story posts, extract the story mechanism that made the post work, not just the first line.
233
- 9. Extract hook structures, not wording.
290
+ 9. Extract hook structures plus specific reusable words, phrases, sentence
291
+ shapes, transitions, and body language patterns.
234
292
  10. Save the research with `mcp__sellable__save_hook_research`.
235
293
 
236
294
  Record provenance:
@@ -247,8 +305,77 @@ Record provenance:
247
305
  - full-text match status
248
306
  - source hook preview measurements and whether they came from full text or a search preview
249
307
  - selected hook patterns
308
+ - exact phrase patterns and sentence shapes
309
+ - body structures and body language patterns
250
310
  - why each pattern fits the user's idea and voice
251
311
 
312
+ ## Step 1.5: Research Learning Report
313
+
314
+ After saving research and before drafting, show the user what the system
315
+ learned when either:
316
+
317
+ - the user asked for research/checkpoint mode
318
+ - the research materially changes the likely hook/body direction
319
+ - the researched examples include new people worth tracking or examples worth
320
+ adding as gold standards
321
+
322
+ Default ad hoc drafting may proceed after this report only when the user clearly
323
+ asked for an immediate draft. In research checkpoint mode, stop here and ask
324
+ which direction to use.
325
+
326
+ The `Research Learning Report` must include:
327
+
328
+ ```text
329
+ Research status:
330
+ - idea/topic:
331
+ - research artifact:
332
+ - search window:
333
+ - keywords:
334
+ - full-text coverage:
335
+ - repost/share data:
336
+
337
+ Best source examples:
338
+ 1. author, URL, engagement, why kept, why not copied
339
+
340
+ Hook patterns learned:
341
+ 1. full adapted hook block
342
+ - source mechanism:
343
+ - preview budget:
344
+ - internal question:
345
+ - why it fits / why it does not:
346
+
347
+ Specific words and phrase shapes:
348
+ 1. "phrase or phrase shape"
349
+ - role:
350
+ - source:
351
+ - reusable forms:
352
+ - adapted Sellable form:
353
+ - do not copy:
354
+
355
+ Body structures learned:
356
+ 1. structure name
357
+ - source:
358
+ - sequence:
359
+ - exact language moves:
360
+ - adapted Sellable body move:
361
+
362
+ Rejected examples:
363
+ - author/source:
364
+ - reason rejected:
365
+
366
+ Save recommendations:
367
+ - track people:
368
+ - gold-standard candidates:
369
+
370
+ Recommended draft directions:
371
+ 1. hook block + body structure
372
+ 2. hook block + body structure
373
+ 3. hook block + body structure
374
+ ```
375
+
376
+ Keep this report concise enough to read, but concrete enough that another agent
377
+ could draft from it without redoing research.
378
+
252
379
  ## Step 2: Hook Candidates
253
380
 
254
381
  Generate at least 12 hook candidates unless the user requested a smaller set.
@@ -35,6 +35,42 @@ Do not store gold standards under `~/.sellable/content/linkedin/**`. Content
35
35
  folders are for ideas, hook research, drafts, published records, and future
36
36
  comment history. Gold standards are durable writing memory.
37
37
 
38
+ ## Creator Tracking
39
+
40
+ When an outside creator/person is approved as someone the user wants to keep
41
+ learning from, save the person separately from the gold-standard post.
42
+
43
+ Use:
44
+
45
+ ```text
46
+ mcp__sellable__upsert_engage_tracked_person({
47
+ name,
48
+ linkedinUrl,
49
+ reason
50
+ })
51
+ ```
52
+
53
+ Tracked people live in:
54
+
55
+ ```text
56
+ ~/.sellable/configs/discovery/influencers.md
57
+ ```
58
+
59
+ Gold-standard post records live in:
60
+
61
+ ```text
62
+ ~/.sellable/configs/core/references/linkedin-posts/
63
+ ```
64
+
65
+ Save both when both are approved:
66
+
67
+ - tracked person: "keep fetching this creator's new posts"
68
+ - gold-standard post: "use this specific post as decomposed writing memory"
69
+
70
+ Do not conflate the two. A person can be tracked without any one post becoming
71
+ a gold standard, and a post can be saved as a gold standard without tracking the
72
+ author.
73
+
38
74
  ## Import Modes
39
75
 
40
76
  ### Personal Best Import
@@ -65,7 +101,11 @@ gold standards.
65
101
  reach, and examples that cannot be adapted to the user's voice.
66
102
  5. Present candidates with a clear "should we use these as gold standards?"
67
103
  approval gate.
68
- 6. Add only the user-approved selections.
104
+ 6. Include a `track person?` recommendation for authors with repeated strong
105
+ topic-fit posts or when the user says they like the person.
106
+ 7. Add only the user-approved post selections.
107
+ 8. Call `mcp__sellable__upsert_engage_tracked_person` only for user-approved
108
+ tracked people.
69
109
 
70
110
  ## Candidate Presentation
71
111
 
@@ -86,6 +126,7 @@ Show compact candidate cards. Include:
86
126
  - voice fit
87
127
  - risks
88
128
  - allowed use recommendation
129
+ - track person recommendation and reason
89
130
 
90
131
  Approval prompt:
91
132
 
@@ -93,7 +134,7 @@ Approval prompt:
93
134
  Gold-standard pack: <current_count>/20 approved.
94
135
 
95
136
  These look like candidates worth saving. Which should I add?
96
- Reply with numbers to add, "skip all", or "replace <existing> with <new>" if the pack is full.
137
+ Reply with numbers to add, "track <author>", "skip all", or "replace <existing> with <new>" if the pack is full.
97
138
  ```
98
139
 
99
140
  Do not write candidates to the approved pack before the user chooses.
@@ -11,6 +11,58 @@ Derive 3-8 keyword searches from:
11
11
  - proven search terms in engage memory
12
12
  - tracked people/inspiration references when relevant
13
13
 
14
+ When research reveals a creator/person the user likes, keep their profile URL
15
+ with the source post. If the user approves tracking them, save them with
16
+ `mcp__sellable__upsert_engage_tracked_person` so future sessions can fetch
17
+ their posts directly instead of rediscovering them ad hoc.
18
+
19
+ ## Background Research Worker
20
+
21
+ Use a background research worker when the host supports it and the research
22
+ needs more than a small handful of posts. This keeps the main orchestrator
23
+ focused on decisions instead of carrying a large source corpus.
24
+
25
+ Worker owns:
26
+
27
+ - broad keyword search
28
+ - tracked-person post fetches
29
+ - full-text matching by URL/activity ID
30
+ - duplicate removal
31
+ - lead-magnet, giveaway, engagement-bait, and off-voice filtering
32
+ - hook opening measurement
33
+ - exact phrase-pattern extraction
34
+ - body-structure extraction
35
+ - rejected-example notes
36
+ - track-person and gold-standard recommendations
37
+
38
+ Orchestrator owns:
39
+
40
+ - deciding whether research is enough
41
+ - saving `mcp__sellable__save_hook_research`
42
+ - showing the `Research Learning Report`
43
+ - asking which direction to draft
44
+ - drafting and validation
45
+
46
+ Worker output must be a compressed research packet, not a data dump:
47
+
48
+ ```text
49
+ Research packet:
50
+ - sources kept: max 8
51
+ - sources rejected: max 8
52
+ - full adapted hook blocks: max 12
53
+ - exact phrase patterns: max 20
54
+ - body patterns: max 8
55
+ - source URLs and author profile URLs
56
+ - preview measurements
57
+ - confidence gaps
58
+ - save recommendations
59
+ ```
60
+
61
+ Do not return the full raw text of every post to the orchestrator. Include only
62
+ short source excerpts needed to explain a phrase pattern, plus URLs. Full text
63
+ belongs in the saved research artifact only when the user approves a specific
64
+ gold-standard candidate and it is safe to store.
65
+
14
66
  ## Default Search
15
67
 
16
68
  Use `mcp__sellable__search_engagement_posts` with practical constraints:
@@ -117,17 +169,22 @@ appears cut off or body context is unavailable.
117
169
 
118
170
  ## Hook Extraction
119
171
 
120
- Extract structure, not wording.
172
+ Extract structure and reusable language patterns, not copied prose. The goal is
173
+ to learn the exact kinds of words, phrase shapes, sentence rhythms, and body
174
+ moves that are working, then adapt them into the user's voice.
121
175
 
122
176
  For each shortlisted source post, record:
123
177
 
124
178
  - URL
125
179
  - author
180
+ - author profile URL when available
126
181
  - engagement totals and available likes/comments/shares breakdown
127
182
  - creator repeat evidence
128
183
  - visible hook text or preview
129
184
  - opening preview measurement fields from the section above
130
185
  - hook mechanism
186
+ - exact hook language patterns: reusable words, phrase shapes, contrast forms,
187
+ sentence shapes, and transition moves
131
188
  - story mechanism when the post is a story
132
189
  - internal question created
133
190
  - emotional trigger
@@ -135,6 +192,81 @@ For each shortlisted source post, record:
135
192
  - lead magnet or engagement bait penalty
136
193
  - weighted signal notes
137
194
  - replicability score
195
+ - track person recommendation: `yes`, `no`, or `ask_user`
196
+ - tracking reason when recommended
197
+
198
+ ## Specific Language Extraction
199
+
200
+ For each keeper, extract the source's specific language mechanics in this
201
+ format:
202
+
203
+ ```text
204
+ Phrase pattern:
205
+ "<phrase or phrase shape>"
206
+
207
+ Role:
208
+ <what the words do: create contrast, compress pain, name the enemy, make timing
209
+ the villain, move from surface action to system outcome, etc.>
210
+
211
+ Source:
212
+ <author + URL>
213
+
214
+ Reusable forms:
215
+ - <template form 1>
216
+ - <template form 2>
217
+ - <template form 3>
218
+
219
+ Adapted to user's idea:
220
+ - <new phrase in the user's voice>
221
+
222
+ Do not copy:
223
+ <words, proof, joke, or company context that belongs to the source>
224
+ ```
225
+
226
+ Examples of the level of specificity required:
227
+
228
+ - "not because [obvious reason]. because [real reason]."
229
+ - "most teams stop at [surface step]."
230
+ - "the [thing] was [state]. you just never [saw/used/launched] it in time."
231
+ - "the maintenance is the tax."
232
+ - "[thing] does not fail in your head. it fails in the gap between [A] and [B]."
233
+ - "the important part is not that AI [surface action]. the important part is that [system outcome]."
234
+ - "one [constrained operator] can run the whole [machine] if [constraint]."
235
+
236
+ Never reduce this section to high-level labels like "contrarian" or
237
+ "founder story." Those labels are allowed only after the exact phrase mechanics
238
+ are captured.
239
+
240
+ ## Body Structure Extraction
241
+
242
+ For each keeper with full text available, extract the body in this format:
243
+
244
+ ```text
245
+ Body pattern:
246
+ <short name>
247
+
248
+ Source:
249
+ <author + URL>
250
+
251
+ Sequence:
252
+ 1. <paragraph/job 1>
253
+ 2. <paragraph/job 2>
254
+ 3. <paragraph/job 3>
255
+
256
+ Exact language moves:
257
+ - "<phrase shape or transition>"
258
+ - "<sentence pattern>"
259
+ - "<closing move>"
260
+
261
+ Adapted body move:
262
+ <how this would show up in the user's post>
263
+
264
+ Replicability:
265
+ high | medium | low
266
+ ```
267
+
268
+ If full text is unavailable, record `full_text_unavailable` and do not infer
269
+ body structure beyond the visible preview.
138
270
 
139
271
  ## Story Mechanism
140
272
 
@@ -165,3 +297,19 @@ Draft-ready output must block or retry when:
165
297
  ## Save Requirement
166
298
 
167
299
  Save the research with `mcp__sellable__save_hook_research` before drafting.
300
+
301
+ The saved research must contain enough detail to support a user-visible
302
+ `Research Learning Report`: source examples, full adapted hook blocks, exact
303
+ phrase patterns, body structures, rejected examples, tracked-person
304
+ recommendations, and gold-standard recommendations.
305
+
306
+ If the user approves a creator/person as a recurring inspiration source, also
307
+ call `mcp__sellable__upsert_engage_tracked_person` with:
308
+
309
+ - `name`: display name
310
+ - `linkedinUrl`: canonical LinkedIn profile URL
311
+ - `reason`: concise lane and why they are worth tracking
312
+
313
+ Do not track a person only because one post was viral. Track them when they have
314
+ repeated strong posts, unusually high topic fit, or the user explicitly says
315
+ they like them.