@sellable/mcp 0.1.40 → 0.1.42

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, 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`";
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 this campaign from. Usually that's you. If someone else will send this campaign, paste their profile instead.\\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 this campaign from. Usually that's you. If someone else will send this campaign, paste their profile instead.\\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.40",
3
+ "version": "0.1.42",
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,
@@ -279,12 +280,13 @@ lead source.
279
280
  Then I’ll turn that into a campaign brief for you to approve before anything is created.
280
281
  ```
281
282
 
282
- Do not silently ask Codex intake or approval questions as plain chat when
283
- `request_user_input` is unavailable in an interactive session. Stop and tell
284
- 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:
285
287
 
286
288
  ```text
287
- 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.
288
290
 
289
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.
290
292
 
@@ -300,7 +302,7 @@ Done. Please fully quit and reopen Codex, then run:
300
302
  $sellable:create-campaign
301
303
 
302
304
  After that, I’ll confirm who we’re launching for, then ask the setup questions
303
- and start the campaign brief.
305
+ in chat and start the campaign brief.
304
306
  ```
305
307
 
306
308
  If they decline, tell them:
@@ -408,7 +410,7 @@ updates.
408
410
  ```text
409
411
  You're in — {activeWorkspaceName} workspace, ready to roll.
410
412
 
411
- 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.
413
+ Now — paste the LinkedIn profile URL of the person you'll be sending this campaign from. Usually that's you. If someone else will send this campaign, paste their profile instead.
412
414
 
413
415
  e.g. https://www.linkedin.com/in/your-handle
414
416
  ```
@@ -419,7 +421,7 @@ updates.
419
421
  ```text
420
422
  You're set up — your {activeWorkspaceName} workspace is ready.
421
423
 
422
- 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.
424
+ Now — paste the LinkedIn profile URL of the person you'll be sending this campaign from. Usually that's you. If someone else will send this campaign, paste their profile instead.
423
425
 
424
426
  e.g. https://www.linkedin.com/in/your-handle
425
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
@@ -259,7 +260,7 @@ me`, `I’ll paste a different sender profile`, and `Other / custom`.
259
260
  that first packet, the first assistant turn may only call
260
261
  `bootstrap_create_campaign`, load this workflow prompt with
261
262
  `get_subskill_prompt({ subskillName: "create-campaign-v2" })`, optionally run
262
- one lightweight identity lookup, then use the structured question gate. After
263
+ one lightweight identity lookup, then confirm launch identity. After
263
264
  identity is confirmed, run the bounded lightweight company-context pass above
264
265
  before generating buyer/offer/proof/source options. If the user
265
266
  supplied a company website/domain, call exactly one of `fetch_company`,
@@ -267,16 +268,18 @@ me`, `I’ll paste a different sender profile`, and `Other / custom`.
267
268
  generating setup options. If the user supplied a LinkedIn profile URL, call
268
269
  `fetch_linkedin_profile` before generating setup options. Do not infer the
269
270
  product category from the company name alone. If no domain, website, LinkedIn
270
- profile, or sender identity is supplied, the first structured question gate
271
- must ask for the launch identity before buyer/offer/source. Before that first
272
- structured question gate, do not run source discovery, Sales Nav, Prospeo,
273
- 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
274
275
  draft-directory inspection/creation. `list_senders` is allowed once before the
275
276
  first identity gate as a quiet token/sender inference shortcut, and once means
276
277
  once: do not call it again after a LinkedIn lookup if it already ran. Do
277
278
  draft-directory setup only after the founder answers. After launch identity is
278
- confirmed, the setup packet must ask buyer, offer/CTA, proof, and lead source,
279
- 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.
280
283
  - After the founder answers the first strategy/source packet, explain the next
281
284
  stage only: campaign brief creation and brief approval. Use this shape:
282
285
 
@@ -473,34 +476,29 @@ Ask the user only when one of these is true:
473
476
  packet so the founder can approve or revise the message deliberately.
474
477
 
475
478
  When asking subjective strategy questions (buyer scope, first ask, proof
476
- emphasis, tone, lead-source preference), always make it clear the user can give
477
- a custom answer. Add an explicit `Other / custom` option to each subjective
478
- question. Do not rely on prose like "you can add detail" as the only custom
479
- 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.
480
484
  Use customer-facing question wording:
481
485
 
482
- - target prospects: `Who should be the target prospects for this campaign? Pick one or combine.`
483
- - main CTA / offer: `What should the main CTA or offer be? Pick one or combine.`
484
- - proof emphasis: `Which proof point would most increase this buyer's confidence in {{company}}? Multi-select fine.`
485
- - lead source: `How should we get the people for this campaign?`
486
-
487
- Ask the lead-source question as the last question in the first strategy
488
- batch, after buyer, offer/ask, and proof/safety are understood. Frame supplied
489
- lists as optional, not required. The three visible options are exactly:
490
-
491
- 1. `Find people for me (recommended if you don't already have your own list)`
492
- 2. `I have a CSV of LinkedIn profiles`
493
- 3. `I have a CSV of company domains`
494
-
495
- Keep `Other / custom` available for freeform answers such as a pasted list,
496
- an existing Sellable lead list, or another source idea. Do not put existing
497
- Sellable lead lists in the main three-option first batch; support them through
498
- custom/freeform input. If the user pastes up to 100 LinkedIn profile URLs or
499
- company domains, normalize the paste into a temporary local CSV and continue
500
- through the matching CSV preview path. Mixed, ambiguous, malformed, or oversized
501
- pastes should ask for a real CSV file instead of guessing. Uploaded CSV support
502
- is larger than paste support: LinkedIn profile CSVs can contain up to 7,500
503
- 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.
504
502
 
505
503
  Avoid internal wording like `Which proof points should the message be allowed
506
504
  to lean on?` because it describes the artifact, not the founder decision.