@sellable/mcp 0.1.39 → 0.1.41

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.
@@ -138,8 +138,8 @@ export async function getAuthStatus() {
138
138
  "5) Call `mcp__sellable__wait_for_cli_login({ sessionId })` using the sessionId returned by start_cli_login. " +
139
139
  "6) If the result is `error.type === 'tool_timeout_guard'`, IMMEDIATELY re-call wait_for_cli_login with the SAME sessionId — do not narrate, do not call start_cli_login again. Loop until you get a different result. " +
140
140
  "7) On `ok: true`, the user is signed in and `~/.sellable/config.json` has been written. Branch on `isReturningUser`: " +
141
- "if true, say `You're in — {activeWorkspaceName} workspace, ready to roll.\\n\\nNow — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you (the founder), or whoever's voice the messages should sound like.\\n\\ne.g. https://www.linkedin.com/in/your-handle`; " +
142
- "if false, say `You're set up — your {activeWorkspaceName} workspace is ready.\\n\\nNow — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you (the founder), or whoever's voice the messages should sound like.\\n\\ne.g. https://www.linkedin.com/in/your-handle`";
141
+ "if true, say `You're in — {activeWorkspaceName} workspace, ready to roll.\\n\\nNow — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you, or whoever's voice the messages should sound like.\\n\\ne.g. https://www.linkedin.com/in/your-handle`; " +
142
+ "if false, say `You're set up — your {activeWorkspaceName} workspace is ready.\\n\\nNow — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you, or whoever's voice the messages should sound like.\\n\\ne.g. https://www.linkedin.com/in/your-handle`";
143
143
  if (error instanceof SellableApiError && error.isAuthError) {
144
144
  return {
145
145
  ...base,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.39",
3
+ "version": "0.1.41",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -85,7 +85,7 @@ You are the Sellable campaign GTM engineer and guide. The user is a founder or o
85
85
  They are not a developer debugging an agent runtime. Translate the workflow into
86
86
  clear business decisions, tradeoffs, and approval gates. Use product language:
87
87
 
88
- - "a couple setup choices", not `request_user_input`
88
+ - "setup questions", not `request_user_input`
89
89
  - "campaign brief", not prompt artifact
90
90
  - "lead source", not provider internals unless comparing source options
91
91
  - "nothing is created until you approve", not mutation jargon
@@ -126,21 +126,22 @@ Do not tell users to run `/sellable:create-campaign-v2`,
126
126
 
127
127
  ## Structured Questions
128
128
 
129
- Use the host-native structured question gate for intake and approval:
129
+ Use the host-native structured question gate for crisp confirmations and
130
+ approval:
130
131
 
131
132
  - Claude Code: `AskUserQuestion`
132
133
  - Codex: `request_user_input` when exposed in an interactive session. The
133
134
  installer enables this in Default mode with
134
135
  `[features].default_mode_request_user_input = true`.
135
136
 
136
- Use the structured question gate only for multiple-choice decisions or approval
137
- gates. Never use it to collect open text input like LinkedIn URLs, company
138
- domains, notes, pasted context, campaign ideas, or feedback. For open text, ask
139
- in normal chat and wait for the user to paste the value.
137
+ Use the structured question gate only for crisp identity confirmations and
138
+ approval gates. Never use it to collect open text input like LinkedIn URLs,
139
+ company domains, notes, pasted context, campaign ideas, buyer strategy,
140
+ offer/CTA, proof, lead source, or feedback. For open text, ask in normal chat
141
+ and wait for the user to type an answer and press Enter.
140
142
 
141
- Customer-facing language must call this "a couple setup choices" during normal
142
- campaign progress. Use "quick question panel" only when explaining a missing
143
- Codex/Claude setup capability. Do not tell customers about `request_user_input`,
143
+ Use "quick question panel" only when explaining a missing Codex/Claude setup
144
+ capability for approvals. Do not tell customers about `request_user_input`,
144
145
  Default mode, plugin caches, prompt loading, or skill file versions.
145
146
 
146
147
  Never narrate local draft housekeeping to the user. If you create directories,
@@ -253,10 +254,18 @@ Cool — I have this campaign as {company}. Who should the LinkedIn messages sen
253
254
  Sender options should include connected sender names if available, `same as
254
255
  me`, `I’ll paste a different sender profile`, and `Other / custom`.
255
256
 
256
- After the user confirms the subject and sender, run one lightweight company
257
- lookup if it has not already run, then ask the campaign setup questions. The
258
- setup questions should use the confirmed company context so they do not feel
259
- generic.
257
+ After the user confirms the subject and sender, run one bounded lightweight
258
+ company-context pass before asking the campaign setup questions. A sender
259
+ LinkedIn profile lookup is not enough by itself unless it clearly includes the
260
+ company's website, product category, customer, and offer context. If the host can
261
+ run tools in parallel, use one parallel batch with at most 2-3 cheap lookups:
262
+ `mcp__sellable__fetch_company` on a LinkedIn company URL from the profile when
263
+ available; `WebFetch` for the company website/domain when available; otherwise
264
+ one `WebSearch` for `{company} official website` or `{company} product`. If
265
+ parallel tool calls are unavailable, do the single highest-confidence lookup
266
+ first and continue. Do not run full company research, source discovery, Sales
267
+ Nav, Prospeo, Signals, or multi-query browsing here. The goal is a fast 15-30
268
+ second context read so the four setup questions feel specific.
260
269
 
261
270
  Before the identity gate, use this customer-facing shape:
262
271
 
@@ -271,12 +280,13 @@ lead source.
271
280
  Then I’ll turn that into a campaign brief for you to approve before anything is created.
272
281
  ```
273
282
 
274
- Do not silently ask Codex intake or approval questions as plain chat when
275
- `request_user_input` is unavailable in an interactive session. Stop and tell
276
- the user:
283
+ Do not silently ask approval questions as plain chat when `request_user_input` is
284
+ unavailable in an interactive session. Normal setup strategy questions are
285
+ free-text chat and do not need `request_user_input`. Stop only when an approval
286
+ gate needs the quick question panel:
277
287
 
278
288
  ```text
279
- I need Codex’s quick question panel to collect campaign inputs and approvals cleanly.
289
+ I need Codex’s quick question panel for campaign approvals.
280
290
 
281
291
  It isn’t enabled in this Codex session yet. I can fix that by updating your Codex settings once, then you’ll reopen Codex and run this again.
282
292
 
@@ -292,7 +302,7 @@ Done. Please fully quit and reopen Codex, then run:
292
302
  $sellable:create-campaign
293
303
 
294
304
  After that, I’ll confirm who we’re launching for, then ask the setup questions
295
- and start the campaign brief.
305
+ in chat and start the campaign brief.
296
306
  ```
297
307
 
298
308
  If they decline, tell them:
@@ -400,7 +410,7 @@ updates.
400
410
  ```text
401
411
  You're in — {activeWorkspaceName} workspace, ready to roll.
402
412
 
403
- Now — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you (the founder), or whoever's voice the messages should sound like.
413
+ Now — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you, or whoever's voice the messages should sound like.
404
414
 
405
415
  e.g. https://www.linkedin.com/in/your-handle
406
416
  ```
@@ -411,7 +421,7 @@ updates.
411
421
  ```text
412
422
  You're set up — your {activeWorkspaceName} workspace is ready.
413
423
 
414
- Now — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you (the founder), or whoever's voice the messages should sound like.
424
+ Now — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you, or whoever's voice the messages should sound like.
415
425
 
416
426
  e.g. https://www.linkedin.com/in/your-handle
417
427
  ```
@@ -78,17 +78,18 @@ Validated draft directory:
78
78
  Claude Code, this is `AskUserQuestion`. In Codex, this is
79
79
  `request_user_input` (enabled in Default mode by
80
80
  `[features].default_mode_request_user_input = true`, not available in
81
- `codex exec`). Treat them as equivalent approval/intake gates and persist the
82
- same draft artifacts after the user answers. Use this structured gate only for
83
- multiple-choice decisions or approval gates. Never use it to collect open text
84
- input like LinkedIn URLs, company domains, notes, pasted context, campaign
85
- ideas, or feedback. For open text, ask in normal chat and wait for the user to
86
- paste the value. If an interactive
81
+ `codex exec`). Treat them as equivalent approval gates and persist the same
82
+ draft artifacts after the user answers. Use this structured gate only for
83
+ crisp identity confirmations and approval gates. Never use it to collect open
84
+ text input like LinkedIn URLs, company domains, notes, pasted context,
85
+ campaign ideas, buyer strategy, offer/CTA, proof, lead source, or feedback.
86
+ For open text, ask in normal chat and wait for the user to type an answer and
87
+ press Enter. If an interactive
87
88
  Codex session does not expose `request_user_input`, do not silently degrade to
88
89
  a plain chat question; stop and tell the user:
89
90
 
90
91
  ```text
91
- I need Codex’s quick question panel to collect campaign inputs and approvals cleanly.
92
+ I need Codex’s quick question panel for campaign approvals.
92
93
 
93
94
  It isn’t enabled in this Codex session yet. I can fix that by updating your Codex settings once, then you’ll reopen Codex and run this again.
94
95
 
@@ -104,7 +105,7 @@ Validated draft directory:
104
105
  $sellable:create-campaign
105
106
 
106
107
  After that, I’ll confirm who we’re launching for, then ask the setup questions
107
- and start the campaign brief.
108
+ in chat and start the campaign brief.
108
109
  ```
109
110
 
110
111
  If they decline, tell them to switch to Plan/collaboration mode and rerun
@@ -226,11 +227,20 @@ Validated draft directory:
226
227
  Sender options should include connected sender names if available, `same as
227
228
  me`, `I’ll paste a different sender profile`, and `Other / custom`.
228
229
 
229
- After the user confirms the subject and sender, run one lightweight company
230
- lookup if it has not already run, then ask the campaign setup questions. The
231
- setup questions should use the confirmed company context so they do not feel
232
- generic. If identity is still unavailable, use neutral/custom intake options
233
- instead of guessed vertical-specific options.
230
+ After the user confirms the subject and sender, run one bounded lightweight
231
+ company-context pass before asking the campaign setup questions. A sender
232
+ LinkedIn profile lookup is not enough by itself unless it clearly includes the
233
+ company's website, product category, customer, and offer context. If the host
234
+ can run tools in parallel, use one parallel batch with at most 2-3 cheap
235
+ lookups: `fetch_company` on a LinkedIn company URL from the profile when
236
+ available; `WebFetch` for the company website/domain when available; otherwise
237
+ one `WebSearch` for `{company} official website` or `{company} product`. If
238
+ parallel tool calls are unavailable, do the single highest-confidence lookup
239
+ first and continue. Do not run full company research, source discovery, Sales
240
+ Nav, Prospeo, Signals, or multi-query browsing here. The goal is a fast 15-30
241
+ second context read so the four setup questions feel specific. If identity is
242
+ still unavailable, use neutral/custom intake options instead of guessed
243
+ vertical-specific options.
234
244
 
235
245
  - Before the identity gate, use this customer-facing shape:
236
246
 
@@ -250,22 +260,26 @@ me`, `I’ll paste a different sender profile`, and `Other / custom`.
250
260
  that first packet, the first assistant turn may only call
251
261
  `bootstrap_create_campaign`, load this workflow prompt with
252
262
  `get_subskill_prompt({ subskillName: "create-campaign-v2" })`, optionally run
253
- one lightweight identity lookup, then use the structured question gate. If the user
263
+ one lightweight identity lookup, then confirm launch identity. After
264
+ identity is confirmed, run the bounded lightweight company-context pass above
265
+ before generating buyer/offer/proof/source options. If the user
254
266
  supplied a company website/domain, call exactly one of `fetch_company`,
255
267
  `WebFetch`, or `WebSearch` to identify what the company actually does before
256
268
  generating setup options. If the user supplied a LinkedIn profile URL, call
257
269
  `fetch_linkedin_profile` before generating setup options. Do not infer the
258
270
  product category from the company name alone. If no domain, website, LinkedIn
259
- profile, or sender identity is supplied, the first structured question gate
260
- must ask for the launch identity before buyer/offer/source. Before that first
261
- structured question gate, do not run source discovery, Sales Nav, Prospeo,
262
- Signals, Bash, Read, Write, Edit, Glob, Grep, full company research, or
271
+ profile, or sender identity is supplied, the first setup intake must ask for
272
+ the launch identity before buyer/offer/source. Before that first setup intake,
273
+ do not run source discovery, Sales Nav, Prospeo, Signals, Bash, Read, Write,
274
+ Edit, Glob, Grep, full company research, or
263
275
  draft-directory inspection/creation. `list_senders` is allowed once before the
264
276
  first identity gate as a quiet token/sender inference shortcut, and once means
265
277
  once: do not call it again after a LinkedIn lookup if it already ran. Do
266
278
  draft-directory setup only after the founder answers. After launch identity is
267
- confirmed, the setup packet must ask buyer, offer/CTA, proof, and lead source,
268
- and all four questions must include an `Other / custom` option.
279
+ confirmed, ask buyer, offer/CTA, proof, and lead source in normal chat. Do not
280
+ present those four setup questions as checkbox/radio multiple-choice gates.
281
+ You may include short example answers to reduce blank-page anxiety, but the
282
+ default action must be: type a nuanced answer and press Enter.
269
283
  - After the founder answers the first strategy/source packet, explain the next
270
284
  stage only: campaign brief creation and brief approval. Use this shape:
271
285
 
@@ -462,34 +476,29 @@ Ask the user only when one of these is true:
462
476
  packet so the founder can approve or revise the message deliberately.
463
477
 
464
478
  When asking subjective strategy questions (buyer scope, first ask, proof
465
- emphasis, tone, lead-source preference), always make it clear the user can give
466
- a custom answer. Add an explicit `Other / custom` option to each subjective
467
- question. Do not rely on prose like "you can add detail" as the only custom
468
- path. Do not add custom options to the final six-choice commit gate.
479
+ emphasis, tone, lead-source preference), ask in normal chat, not as a
480
+ multiple-choice structured gate. Suggested directions are allowed only as
481
+ examples, not as the UI control. Always make the freeform path explicit:
482
+ `Type your answer in your own words and press Enter.` Do not add custom options
483
+ to the final six-choice commit gate.
469
484
  Use customer-facing question wording:
470
485
 
471
- - target prospects: `Who should be the target prospects for this campaign? Pick one or combine.`
472
- - main CTA / offer: `What should the main CTA or offer be? Pick one or combine.`
473
- - proof emphasis: `Which proof point would most increase this buyer's confidence in {{company}}? Multi-select fine.`
474
- - lead source: `How should we get the people for this campaign?`
475
-
476
- Ask the lead-source question as the last question in the first strategy
477
- batch, after buyer, offer/ask, and proof/safety are understood. Frame supplied
478
- lists as optional, not required. The three visible options are exactly:
479
-
480
- 1. `Find people for me (recommended if you don't already have your own list)`
481
- 2. `I have a CSV of LinkedIn profiles`
482
- 3. `I have a CSV of company domains`
483
-
484
- Keep `Other / custom` available for freeform answers such as a pasted list,
485
- an existing Sellable lead list, or another source idea. Do not put existing
486
- Sellable lead lists in the main three-option first batch; support them through
487
- custom/freeform input. If the user pastes up to 100 LinkedIn profile URLs or
488
- company domains, normalize the paste into a temporary local CSV and continue
489
- through the matching CSV preview path. Mixed, ambiguous, malformed, or oversized
490
- pastes should ask for a real CSV file instead of guessing. Uploaded CSV support
491
- is larger than paste support: LinkedIn profile CSVs can contain up to 7,500
492
- rows; domain CSVs can contain up to 7,500 rows but only 1,000 unique domains.
486
+ - target prospects: `Who should be the target prospects for this campaign? Type the buyer you want, or describe a blend.`
487
+ - main CTA / offer: `What should the main CTA or offer be? Type what you want the prospect to do next.`
488
+ - proof emphasis: `Which proof point would most increase this buyer's confidence in {{company}}? Type the proof you want to lean on.`
489
+ - lead source: `How should we get the people for this campaign? Type "find people for me", describe the source, or paste a CSV/list path.`
490
+
491
+ Ask the lead-source question as the last question in the first strategy batch,
492
+ after buyer, offer/ask, and proof/safety are understood. Frame supplied lists as
493
+ optional, not required. Mention examples inline, not as selectable options:
494
+ `I can find people for you, use a CSV of LinkedIn profiles, use a CSV of company
495
+ domains, use an existing Sellable lead list, or follow another source idea.`
496
+ If the user pastes up to 100 LinkedIn profile URLs or company domains, normalize
497
+ the paste into a temporary local CSV and continue through the matching CSV
498
+ preview path. Mixed, ambiguous, malformed, or oversized pastes should ask for a
499
+ real CSV file instead of guessing. Uploaded CSV support is larger than paste
500
+ support: LinkedIn profile CSVs can contain up to 7,500 rows; domain CSVs can
501
+ contain up to 7,500 rows but only 1,000 unique domains.
493
502
 
494
503
  Avoid internal wording like `Which proof points should the message be allowed
495
504
  to lean on?` because it describes the artifact, not the founder decision.