@sellable/mcp 0.1.25 → 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 +2 -2
- package/package.json +1 -1
- package/skills/create-campaign-v2/SKILL.md +35 -31
- package/skills/create-campaign-v2/SOUL.md +13 -7
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.
|
|
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.
|
|
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
|
@@ -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.
|
|
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
|
|
145
|
-
|
|
146
|
-
|
|
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
|
|
158
|
-
2. `
|
|
159
|
-
3. `
|
|
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
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
`
|
|
169
|
-
|
|
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.
|
|
173
|
-
|
|
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,
|
|
184
|
-
|
|
185
|
-
sender"; it is to learn who the user is, infer the
|
|
186
|
-
company, and then confirm who we are sending from. The
|
|
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
|
-
|
|
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.
|
|
@@ -146,10 +146,10 @@ brief before anything is created.
|
|
|
146
146
|
Good identity setup:
|
|
147
147
|
|
|
148
148
|
```text
|
|
149
|
-
I’ll check whether you already have a connected
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
149
|
+
I’ll check whether you already have a connected sender here. If I find one, I’ll
|
|
150
|
+
ask whether that’s 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.
|
|
153
153
|
```
|
|
154
154
|
|
|
155
155
|
Bad:
|
|
@@ -167,9 +167,15 @@ First I’ll check whether your Sellable token already tells me who you are.
|
|
|
167
167
|
Better:
|
|
168
168
|
|
|
169
169
|
```text
|
|
170
|
-
I
|
|
171
|
-
|
|
172
|
-
|
|
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?
|
|
173
179
|
```
|
|
174
180
|
|
|
175
181
|
Bad:
|