@sellable/mcp 0.1.24 → 0.1.26

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 CHANGED
@@ -83,14 +83,14 @@ The token is provided when you generate it. Use `list_workspaces` +
83
83
  For customer/package installs, use the public installer:
84
84
 
85
85
  ```bash
86
- npx -y @sellable/install@0.1.24 --host codex --token skt_live_your_token_here --workspace-id your_workspace_id
86
+ npx -y @sellable/install@0.1.26 --host codex --token skt_live_your_token_here --workspace-id your_workspace_id
87
87
  ```
88
88
 
89
89
  If you already have `~/.sellable/config.json`, rerun/verify without rewriting
90
90
  auth:
91
91
 
92
92
  ```bash
93
- npx -y @sellable/install@0.1.24 --host codex
93
+ npx -y @sellable/install@0.1.26 --host codex
94
94
  sellable --verify-only --host codex
95
95
  ```
96
96
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.24",
3
+ "version": "0.1.26",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -79,7 +79,11 @@ Validated draft directory:
79
79
  `request_user_input` (enabled in Default mode by
80
80
  `[features].default_mode_request_user_input = true`, not available in
81
81
  `codex exec`). Treat them as equivalent approval/intake gates and persist the
82
- same draft artifacts after the user answers. If an interactive
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
83
87
  Codex session does not expose `request_user_input`, do not silently degrade to
84
88
  a plain chat question; stop and tell the user:
85
89
 
@@ -141,10 +145,10 @@ Validated draft directory:
141
145
  the campaign subject and sender before continuing.
142
146
  - If the user did not provide the launch identity, quietly call `list_senders`
143
147
  once if available. This is a shortcut to deduce who the user might be from
144
- their Sellable API token and connected LinkedIn accounts. Do not present it as
145
- a sender picker yet. If there is one strong likely sender, use `enrich_sender`
146
- to infer their current or most recent company, then ask a structured
147
- confirmation question:
148
+ their Sellable API token and connected LinkedIn accounts. Do not ask the user
149
+ to pick an input type before checking connected senders. If there is any likely
150
+ connected sender, use `enrich_sender` on the best match to infer their current
151
+ or most recent company, then ask a structured confirmation question:
148
152
 
149
153
  ```text
150
154
  I’m ready to build this in {workspace}. I found {matched sender} connected here.
@@ -152,25 +156,30 @@ Validated draft directory:
152
156
  Is that you, and is this campaign for {company}?
153
157
  ```
154
158
 
155
- The options must be:
159
+ The structured options must be no more than three choices:
156
160
 
157
- 1. `Yes, that's me and this is for {company}`
158
- 2. `That's me, but this is for a different company`
159
- 3. `No, I'll paste my LinkedIn URL so you can look me up`
160
- 4. `No, I'll paste the company website instead`
161
- 5. `Other / custom`
161
+ 1. `Yes use {matched sender} for {company}`
162
+ 2. `No I'll paste a LinkedIn profile`
163
+ 3. `Use a company domain instead`
162
164
 
163
- If the user chooses option 2, ask for the company website/domain and call
164
- `fetch_company` when possible, otherwise one web lookup. If the user chooses
165
- option 3, ask for their LinkedIn URL, call `fetch_linkedin_profile`, infer
166
- their current or most recent company, then confirm company and sender again.
167
- If the user chooses option 4, ask for the company website/domain, call
168
- `fetch_company` when possible, otherwise one web lookup, then ask who the
169
- LinkedIn messages should send from.
165
+ If there are multiple likely connected senders, mention the best one in the
166
+ question and use option 2 for either a different connected sender or a pasted
167
+ LinkedIn profile.
168
+
169
+ Use the structured question tool only for the choice. Do not use
170
+ `request_user_input`/`AskUserQuestion` to collect a LinkedIn URL, company
171
+ domain, or freeform text. If the user chooses option 2, ask in normal chat:
172
+ `Paste the LinkedIn URL I should use, and I’ll look it up.` Then call
173
+ `fetch_linkedin_profile`, infer their current or most recent company, and
174
+ confirm company and sender again. If the user chooses option 3, ask in normal
175
+ chat: `Paste the company domain, and I’ll do a quick lookup before we keep
176
+ going.` Then call `fetch_company` when possible, otherwise one web lookup, and
177
+ ask who the LinkedIn messages should send from.
170
178
 
171
179
  If `list_senders` returns zero connected senders, avoid the sender-confirmation
172
- branch entirely. Ask for the user's LinkedIn URL or the company they want to
173
- send on behalf of so you can research context:
180
+ branch entirely. Do not ask the user to choose an input type with the
181
+ structured question tool. Ask in normal chat for the user's LinkedIn URL or the
182
+ company they want to send on behalf of so you can research context:
174
183
 
175
184
  ```text
176
185
  I’m ready to build this in {workspace}.
@@ -180,11 +189,11 @@ Validated draft directory:
180
189
  offer, proof, and lead source.
181
190
  ```
182
191
 
183
- If there is no strong sender match, make the first setup choice ask for the
184
- user's LinkedIn URL or company website. The point of this gate is not "pick a
185
- sender"; it is to learn who the user is, infer the current or most recent
186
- company, and then confirm who we are sending from. The customer-facing shape
187
- should be:
192
+ If there is no strong sender match, do not show a structured choice that says
193
+ "LinkedIn profile" vs "Company website". The point of this gate is not "pick a
194
+ sender" or "pick an input type"; it is to learn who the user is, infer the
195
+ current or most recent company, and then confirm who we are sending from. The
196
+ customer-facing shape should be:
188
197
 
189
198
  ```text
190
199
  I’m ready to build this in {workspace}.
@@ -193,12 +202,7 @@ Validated draft directory:
193
202
  the company website instead.
194
203
  ```
195
204
 
196
- The LinkedIn/company identity gate should ask:
197
-
198
- 1. `What’s your LinkedIn URL?` Options: `I’ll paste my LinkedIn profile`,
199
- `I’ll paste the company website instead`, `Other / custom`.
200
-
201
- After that answer, do the lightweight lookup. For a LinkedIn profile, call
205
+ After the user pastes a URL/domain, do the lightweight lookup. For a LinkedIn profile, call
202
206
  `fetch_linkedin_profile` and infer the user's current or most recent company
203
207
  from the profile. For a company website, call `fetch_company` when possible,
204
208
  otherwise one web lookup.
@@ -929,7 +933,9 @@ evaluating Clay` when the only evidence is a post reaction), using forbidden
929
933
  - `Fallback if missing:` is required for every token in the template. Each
930
934
  fallback must say exactly what to do when the row lacks clean data: use a
931
935
  safe segment-level phrase, omit the sentence/line, or route to
932
- `revise-messaging` if omission would break the message. Never leave a token
936
+ `revise-messaging` if omission would break the message. It must include a
937
+ concrete example of the fallback behavior, such as `omit the noticed... line`,
938
+ `use "operators"`, or `use "your outbound workflow"`. Never leave a token
933
939
  with "N/A", "unknown", empty braces, bracketed instructions, or a generic
934
940
  fill that sounds robotic or creepy.
935
941
  - rendered examples may only use token values that exist in `lead-sample.json`,
@@ -1131,8 +1137,8 @@ Do not:
1131
1137
  - `Bad token fill:` with a realistic wrong fill for the current campaign
1132
1138
  - `Why bad:` explaining the exact overclaim, unsupported token, weak signal,
1133
1139
  casing mistake, or mail-merge phrasing that makes the bad fill unacceptable
1134
- - `Fallback if missing:` with one fallback or omit rule for every token in the
1135
- template
1140
+ - `Fallback if missing:` with one concrete fallback or omit example for every
1141
+ token in the template
1136
1142
  - `Token notes:` naming which tokens are safe to fill, which optional token line
1137
1143
  should be omitted when absent, and whether the message uses standard sentence
1138
1144
  case or casual lowercase static words
@@ -74,8 +74,9 @@ the tokens should and should not be filled.
74
74
 
75
75
  Every token needs a fallback. If the row does not have clean data for a token,
76
76
  the approval view should say whether to use a safe segment-level phrase, omit
77
- the sentence, or revise the message. Missing data should never produce robotic
78
- or creepy copy.
77
+ the sentence, or revise the message. It should include the exact fallback
78
+ example, like `omit the noticed... line` or `use "operators"`. Missing data
79
+ should never produce robotic or creepy copy.
79
80
 
80
81
  Approved token guidance is part of the campaign, not just the review. When a
81
82
  campaign is minted, the approved brief should carry forward the token fill
@@ -145,10 +146,10 @@ brief before anything is created.
145
146
  Good identity setup:
146
147
 
147
148
  ```text
148
- I’ll check whether you already have a connected LinkedIn account here. If I cant
149
- confirm it, Ill ask for your LinkedIn URL or company website and use that to
150
- understand the company before we choose the target, offer, proof, and lead
151
- source.
149
+ I’ll check whether you already have a connected sender here. If I find one, Ill
150
+ ask whether thats you and whether this campaign is for that company. If not,
151
+ just paste your LinkedIn URL or company domain and I’ll look it up before we
152
+ keep going.
152
153
  ```
153
154
 
154
155
  Bad:
@@ -166,9 +167,15 @@ First I’ll check whether your Sellable token already tells me who you are.
166
167
  Better:
167
168
 
168
169
  ```text
169
- I’ll first check whether you already have a connected sender here. If not, I’ll
170
- ask for your LinkedIn URL or company website and use that to understand the
171
- campaign before we choose the audience and offer.
170
+ I found Christian Reyes connected here. Is that you, and is this campaign for
171
+ Sellable? If not, choose LinkedIn profile or company domain and I’ll ask you to
172
+ paste it in chat.
173
+ ```
174
+
175
+ Bad:
176
+
177
+ ```text
178
+ What should I use to confirm who this campaign is for?
172
179
  ```
173
180
 
174
181
  Bad:
@@ -649,6 +649,7 @@
649
649
  "tokenized template plus filled sample prospect",
650
650
  "good and bad token-fill examples",
651
651
  "per-token fallback rules for missing row data",
652
+ "concrete fallback examples, not abstract fallback advice",
652
653
  "complete rendered subject plus body examples",
653
654
  "message-review hard-fail preflight",
654
655
  "A + B + C subject quality",