@sellable/mcp 0.1.10 → 0.1.12

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.10 --host codex --token skt_live_your_token_here --workspace-id your_workspace_id
86
+ npx -y @sellable/install@0.1.12 --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.10 --host codex
93
+ npx -y @sellable/install@0.1.12 --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.10",
3
+ "version": "0.1.12",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -99,7 +99,8 @@ Validated draft directory:
99
99
 
100
100
  $sellable:create-campaign
101
101
 
102
- After that, I’ll ask the 4 setup questions and start the campaign brief.
102
+ After that, I’ll confirm who we’re launching for, then ask the setup questions
103
+ and start the campaign brief.
103
104
  ```
104
105
 
105
106
  If they decline, tell them to switch to Plan/collaboration mode and rerun
@@ -111,16 +112,66 @@ Validated draft directory:
111
112
  question panel", "campaign brief", "lead sourcing", and "approval" instead of
112
113
  `request_user_input`, Default mode, MCP namespaces, plugin caches, prompt
113
114
  loading, runbooks, local skill files, or skill versions.
114
- - Before the first intake gate, use this customer-facing shape:
115
+ - Do not treat the active Sellable workspace as the campaign subject. The
116
+ workspace only tells you where the campaign will be saved. Before buyer, CTA,
117
+ proof, or source questions, identify two things:
118
+ 1. who/what company this campaign is for, and
119
+ 2. who the LinkedIn messages should send from.
120
+ - If the user supplied a LinkedIn profile, website, domain, company name, or
121
+ sender name in the invocation, do one lightweight lookup first:
122
+ - LinkedIn profile: call `fetch_linkedin_profile`.
123
+ - Website/domain/company: call `fetch_company` when possible, otherwise one
124
+ web lookup.
125
+ - Workspace sender id or known sender: call `get_sender` or `enrich_sender`.
126
+ Then summarize what you found in one or two lines and ask the user to confirm
127
+ the campaign subject and sender before continuing.
128
+ - If the user did not provide the launch identity, make the first quick question
129
+ panel an identity gate. The point of this gate is not "pick a sender"; it is
130
+ to learn who the user is / what company we are launching for, and who we
131
+ should send from. Before that gate, call `list_senders` once if it is
132
+ available, only so you can offer connected senders as shortcuts. The
133
+ customer-facing shape should be:
134
+
135
+ ```text
136
+ I found these connected senders in {workspace}: {sender names}.
137
+
138
+ First I need to know who this campaign is for and who we’re sending from. If
139
+ one of these connected senders is you, pick them; otherwise paste your LinkedIn
140
+ URL or company website.
141
+ ```
142
+
143
+ The identity gate should ask:
144
+
145
+ 1. `Who is this campaign for?` Options: connected sender names if available,
146
+ `I’ll paste a LinkedIn profile`, `I’ll paste a company website/domain`,
147
+ `Other / custom`.
148
+ 2. `Who should the LinkedIn messages send from?` Options:
149
+ `same person/company`, connected sender names if available,
150
+ `I’ll paste a different sender profile`, `Other / custom`.
151
+
152
+ After that answer, do the lightweight lookup. For a connected sender, call
153
+ `enrich_sender` and identify their current or most recent company. For a
154
+ LinkedIn profile, call `fetch_linkedin_profile` and infer the current or most
155
+ recent company from the profile. Then ask:
156
+
157
+ ```text
158
+ Cool — I have this as {campaign subject/company}, sending from {sender}. Is that right?
159
+ ```
160
+
161
+ After the user confirms the subject and sender, run one lightweight company
162
+ lookup (`fetch_company` when possible, otherwise one web lookup), then ask the
163
+ campaign setup questions. The setup questions should use the confirmed company
164
+ context so they do not feel generic. If identity is still unavailable, use
165
+ neutral/custom intake options instead of guessed vertical-specific options.
166
+
167
+ - Before the identity gate, use this customer-facing shape:
115
168
 
116
169
  ```text
117
170
  I’m ready to build the campaign in {workspace}.
118
171
 
119
- First I’ll ask 4 quick setup questions:
120
- 1. who you want to target
121
- 2. what you want them to do
122
- 3. what proof or offer we should use
123
- 4. where we should source leads
172
+ First I need to confirm who this campaign is for and who we’re sending from.
173
+ If you already have a connected sender, I can use that to infer the company;
174
+ otherwise paste a LinkedIn profile or company website and I’ll look it up.
124
175
 
125
176
  Then I’ll turn that into a campaign brief for you to approve before anything is created.
126
177
  ```
@@ -133,16 +184,18 @@ Validated draft directory:
133
184
  one lightweight identity lookup, then use the structured question gate. If the user
134
185
  supplied a company website/domain, call exactly one of `fetch_company`,
135
186
  `WebFetch`, or `WebSearch` to identify what the company actually does before
136
- generating intake options. If the user supplied a LinkedIn profile URL, call
137
- `fetch_linkedin_profile` before generating intake options. Do not infer the
138
- product category from the company name alone. If no domain, website, or
139
- LinkedIn profile is supplied, use neutral/custom intake options rather than
140
- guessed vertical-specific options. Before the first structured question gate,
141
- do not run sender research, `list_senders`, source discovery, Sales Nav, Prospeo,
187
+ generating setup options. If the user supplied a LinkedIn profile URL, call
188
+ `fetch_linkedin_profile` before generating setup options. Do not infer the
189
+ product category from the company name alone. If no domain, website, LinkedIn
190
+ profile, or sender identity is supplied, the first structured question gate
191
+ must ask for the launch identity before buyer/offer/source. Before that first
192
+ structured question gate, do not run source discovery, Sales Nav, Prospeo,
142
193
  Signals, Bash, Read, Write, Edit, Glob, Grep, full company research, or
143
- draft-directory inspection/creation. Do draft-directory setup only after the
144
- founder answers. The first intake packet must ask buyer, offer/CTA, proof, and
145
- lead source, and all four questions must include an `Other / custom` option.
194
+ draft-directory inspection/creation. `list_senders` is allowed once before the
195
+ first identity gate so the user can pick from connected senders. Do
196
+ draft-directory setup only after the founder answers. After launch identity is
197
+ confirmed, the setup packet must ask buyer, offer/CTA, proof, and lead source,
198
+ and all four questions must include an `Other / custom` option.
146
199
  - After the founder answers the first strategy/source packet, explain the next
147
200
  stage only: campaign brief creation and brief approval. Use this shape:
148
201
 
@@ -28,13 +28,15 @@ approval. Hide implementation details unless they are needed to unblock setup.
28
28
  The customer believes Sellable is helping them launch a campaign. Keep every
29
29
  turn anchored to that:
30
30
 
31
- 1. Understand the campaign.
32
- 2. Turn it into a campaign brief.
33
- 3. Find likely responders.
34
- 4. Filter for fit.
35
- 5. Draft messages.
36
- 6. Ask for approval.
37
- 7. Create the campaign.
31
+ 1. Confirm who/what company the campaign is for.
32
+ 2. Confirm who the LinkedIn messages send from.
33
+ 3. Understand the company and offer.
34
+ 4. Turn that into a campaign brief.
35
+ 5. Find likely responders.
36
+ 6. Filter for fit.
37
+ 7. Draft messages.
38
+ 8. Ask for approval.
39
+ 9. Create the campaign.
38
40
 
39
41
  ## Progress Updates
40
42
 
@@ -97,17 +97,26 @@
97
97
  "onEnter": [
98
98
  {
99
99
  "action": "resolve_company_identity_before_strategy_packet",
100
- "optional": true,
101
- "when": "user_supplied_company_domain_website_or_linkedin_profile",
100
+ "optional": false,
101
+ "when": "before_founder_strategy_source_packet",
102
102
  "allowedTools": [
103
+ "list_senders",
104
+ "get_sender",
105
+ "enrich_sender",
103
106
  "fetch_company",
104
107
  "fetch_linkedin_profile",
105
108
  "WebFetch",
106
109
  "WebSearch"
107
110
  ],
108
- "maxCalls": 1,
111
+ "maxCalls": {
112
+ "list_senders": 1,
113
+ "identityLookup": 1,
114
+ "companyLookupAfterIdentityConfirm": 1
115
+ },
116
+ "preferConnectedSendersFirst": true,
117
+ "confirmCompanyBeforeStrategyQuestions": true,
109
118
  "mustNotInferFromNameOnly": true,
110
- "fallback": "use neutral/custom intake options when identity is unavailable"
119
+ "fallback": "ask identity gate first; use neutral/custom intake options only when identity remains unavailable"
111
120
  },
112
121
  {
113
122
  "action": "render_post_intake_progress_preamble",
@@ -161,6 +170,8 @@
161
170
  "get_subskill_prompt",
162
171
  "get_auth_status",
163
172
  "get_active_workspace",
173
+ "list_senders",
174
+ "get_sender",
164
175
  "enrich_sender",
165
176
  "complete_sender_research",
166
177
  "fetch_company",