@sellable/mcp 0.1.0
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/.claude-plugin/plugin.json +12 -0
- package/.mcp.json +9 -0
- package/README.md +355 -0
- package/dist/api.d.ts +21 -0
- package/dist/api.js +73 -0
- package/dist/auth.d.ts +60 -0
- package/dist/auth.js +246 -0
- package/dist/engage-memory.d.ts +63 -0
- package/dist/engage-memory.js +354 -0
- package/dist/index-dev.d.ts +2 -0
- package/dist/index-dev.js +17 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +8 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +499 -0
- package/dist/skills.d.ts +11 -0
- package/dist/skills.js +97 -0
- package/dist/tools/auth.d.ts +30 -0
- package/dist/tools/auth.js +124 -0
- package/dist/tools/blueprint-commit.d.ts +174 -0
- package/dist/tools/blueprint-commit.js +286 -0
- package/dist/tools/bootstrap.d.ts +64 -0
- package/dist/tools/bootstrap.js +246 -0
- package/dist/tools/campaigns.d.ts +589 -0
- package/dist/tools/campaigns.js +892 -0
- package/dist/tools/cells.d.ts +58 -0
- package/dist/tools/cells.js +48 -0
- package/dist/tools/context.d.ts +88 -0
- package/dist/tools/context.js +271 -0
- package/dist/tools/csv-domains.d.ts +73 -0
- package/dist/tools/csv-domains.js +464 -0
- package/dist/tools/csv-linkedin.d.ts +102 -0
- package/dist/tools/csv-linkedin.js +712 -0
- package/dist/tools/direct-campaigns.d.ts +240 -0
- package/dist/tools/direct-campaigns.js +250 -0
- package/dist/tools/engage-bootstrap.d.ts +94 -0
- package/dist/tools/engage-bootstrap.js +205 -0
- package/dist/tools/engage-discovery.d.ts +78 -0
- package/dist/tools/engage-discovery.js +150 -0
- package/dist/tools/engage-memory.d.ts +181 -0
- package/dist/tools/engage-memory.js +143 -0
- package/dist/tools/engage-state.d.ts +72 -0
- package/dist/tools/engage-state.js +62 -0
- package/dist/tools/enrichment.d.ts +167 -0
- package/dist/tools/enrichment.js +174 -0
- package/dist/tools/flow-preflight.d.ts +68 -0
- package/dist/tools/flow-preflight.js +138 -0
- package/dist/tools/framework.d.ts +44 -0
- package/dist/tools/framework.js +153 -0
- package/dist/tools/interaction-mode.d.ts +27 -0
- package/dist/tools/interaction-mode.js +102 -0
- package/dist/tools/leads.d.ts +2417 -0
- package/dist/tools/leads.js +2307 -0
- package/dist/tools/linkedin.d.ts +210 -0
- package/dist/tools/linkedin.js +229 -0
- package/dist/tools/navigation.d.ts +91 -0
- package/dist/tools/navigation.js +381 -0
- package/dist/tools/one-off.d.ts +229 -0
- package/dist/tools/one-off.js +273 -0
- package/dist/tools/processing.d.ts +70 -0
- package/dist/tools/processing.js +56 -0
- package/dist/tools/prompts.d.ts +211 -0
- package/dist/tools/prompts.js +210 -0
- package/dist/tools/provider-preflight.d.ts +21 -0
- package/dist/tools/provider-preflight.js +59 -0
- package/dist/tools/readiness.d.ts +261 -0
- package/dist/tools/readiness.js +510 -0
- package/dist/tools/rows.d.ts +126 -0
- package/dist/tools/rows.js +105 -0
- package/dist/tools/rubrics.d.ts +497 -0
- package/dist/tools/rubrics.js +681 -0
- package/dist/tools/senders.d.ts +44 -0
- package/dist/tools/senders.js +69 -0
- package/dist/tools/sequencer.d.ts +127 -0
- package/dist/tools/sequencer.js +194 -0
- package/dist/tools/tables.d.ts +35 -0
- package/dist/tools/tables.js +36 -0
- package/dist/tools/verify-row.d.ts +36 -0
- package/dist/tools/verify-row.js +38 -0
- package/dist/tools/workspaces.d.ts +140 -0
- package/dist/tools/workspaces.js +139 -0
- package/dist/utils/workspace-root.d.ts +1 -0
- package/dist/utils/workspace-root.js +39 -0
- package/package.json +46 -0
- package/skills/building-gtm-tables/SKILL.md +216 -0
- package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
- package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
- package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
- package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
- package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
- package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
- package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
- package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
- package/skills/building-gtm-tables/references/verify-loop.md +74 -0
- package/skills/campaign-messages/SKILL.md +173 -0
- package/skills/campaign-messages/flow.v1.json +75 -0
- package/skills/craft-message/SKILL.md +401 -0
- package/skills/create-campaign/ARCHITECTURE.md +232 -0
- package/skills/create-campaign/DISCUSS.md +296 -0
- package/skills/create-campaign/FLOW_ASCII.md +240 -0
- package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
- package/skills/create-campaign/README.md +142 -0
- package/skills/create-campaign/SKILL.md +286 -0
- package/skills/create-campaign/context/README.md +67 -0
- package/skills/create-campaign/context/_TEMPLATE.md +12 -0
- package/skills/create-campaign/context/context.md +35 -0
- package/skills/create-campaign/context/learnings.md +16 -0
- package/skills/create-campaign/context/registry.json +19 -0
- package/skills/create-campaign/core/flow.v1.json +217 -0
- package/skills/create-campaign/core/policy.md +191 -0
- package/skills/create-campaign/core/providers/apollo.json +35 -0
- package/skills/create-campaign/core/providers/prospeo.json +34 -0
- package/skills/create-campaign/core/providers/registry.json +31 -0
- package/skills/create-campaign/core/providers/sales-nav.json +37 -0
- package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
- package/skills/create-campaign/references/brief-template.md +64 -0
- package/skills/create-campaign/references/campaign-quality.md +84 -0
- package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
- package/skills/create-campaign/references/offer-patterns.md +108 -0
- package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
- package/skills/create-campaign/references/question-examples.md +167 -0
- package/skills/create-campaign/references/token-fill-examples.md +81 -0
- package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
- package/skills/create-campaign-brief/DISCUSS.md +64 -0
- package/skills/create-campaign-brief/README.md +176 -0
- package/skills/create-campaign-brief/SKILL.md +537 -0
- package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
- package/skills/create-campaign-brief/references/brief-template.md +220 -0
- package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
- package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
- package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
- package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
- package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
- package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
- package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
- package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
- package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
- package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
- package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
- package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
- package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
- package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
- package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
- package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
- package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
- package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
- package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
- package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
- package/skills/create-campaign-v2/SKILL.md +1619 -0
- package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
- package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
- package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
- package/skills/create-campaign-v2/core/policy.md +82 -0
- package/skills/create-campaign-v2/references/ai-tells.md +253 -0
- package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
- package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
- package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
- package/skills/create-campaign-v2/references/filter-leads.md +495 -0
- package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
- package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
- package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
- package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
- package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
- package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
- package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
- package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
- package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
- package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
- package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
- package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
- package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
- package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
- package/skills/create-campaign-v2-validation/SKILL.md +296 -0
- package/skills/create-post/SKILL.md +1308 -0
- package/skills/create-rubric/SKILL.md +251 -0
- package/skills/engage/SKILL.md +549 -0
- package/skills/engage/core/README.md +23 -0
- package/skills/engage/core/proven-searches.json +11 -0
- package/skills/engage/core/style-guide.template.md +47 -0
- package/skills/engage/core/tracked-people.json +10 -0
- package/skills/enrich-prospects/SKILL.md +97 -0
- package/skills/find-leads/SKILL.md +467 -0
- package/skills/generate-messages/SKILL.md +2361 -0
- package/skills/interview/SKILL.md +132 -0
- package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
- package/skills/interview/core/ICP.template.md +54 -0
- package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
- package/skills/providers/apollo.md +520 -0
- package/skills/providers/prospeo.md +398 -0
- package/skills/providers/sales-nav.md +372 -0
- package/skills/providers/signal-discovery.md +495 -0
- package/skills/research/SKILL.md +258 -0
- package/skills/research/config.json +9 -0
- package/skills/research/override.md +13 -0
- package/skills/research-prospect/SKILL.md +99 -0
- package/skills/research-sender/SKILL.md +158 -0
- package/skills/workflow-sequences/SKILL.md +85 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# Create Campaign Policy (Deterministic + Extensible)
|
|
2
|
+
|
|
3
|
+
This policy is the invariant layer. Follow it even if other instructions are ambiguous.
|
|
4
|
+
|
|
5
|
+
## 1) Deterministic Control Surface
|
|
6
|
+
|
|
7
|
+
You are not inventing the workflow. You are executing a configured state machine.
|
|
8
|
+
|
|
9
|
+
- The source of truth for steps, transitions, and required tool calls is:
|
|
10
|
+
1. `get_campaign_framework()` output
|
|
11
|
+
2. The tool results you just received
|
|
12
|
+
3. Explicit user instructions
|
|
13
|
+
- If policy and framework conflict, policy wins.
|
|
14
|
+
|
|
15
|
+
## 2) Required Runtime Bootstrap
|
|
16
|
+
|
|
17
|
+
At the start of every `/sellable:create-campaign` run:
|
|
18
|
+
|
|
19
|
+
1. Load tools (single message with multiple ToolSearch calls):
|
|
20
|
+
- `mcp__sellable__enrich_sender`
|
|
21
|
+
- `mcp__sellable__create_campaign`
|
|
22
|
+
- `mcp__sellable__update_campaign`
|
|
23
|
+
- `mcp__sellable__update_campaign_brief`
|
|
24
|
+
- `mcp__sellable__get_auth_status`
|
|
25
|
+
- `mcp__sellable__get_campaign_framework`
|
|
26
|
+
- `mcp__sellable__get_campaign_context`
|
|
27
|
+
2. Call `get_auth_status({})` and store it as `auth`.
|
|
28
|
+
3. If `auth.ok !== true`, stop and follow `auth.error.guidance`.
|
|
29
|
+
4. Call `get_campaign_framework({ flowVersion: "v1", includePlugins: true })`.
|
|
30
|
+
5. Store the response as `framework` and obey it.
|
|
31
|
+
6. If the user provides `campaignId` (e.g., `cmp_...`):
|
|
32
|
+
- Call `create_campaign({ campaignId })` to get the watchUrl
|
|
33
|
+
- Then call `get_campaign_context({ campaignId, refresh: true })`
|
|
34
|
+
- Treat this as resume mode; do not create a new campaign unless asked
|
|
35
|
+
|
|
36
|
+
Do not proceed until the framework is loaded.
|
|
37
|
+
|
|
38
|
+
## 3) Watch Mode Protocol (Always-On)
|
|
39
|
+
|
|
40
|
+
Any time you change UI state via `currentStep`, you must orient the user.
|
|
41
|
+
|
|
42
|
+
After every `update_campaign({ currentStep: ... })` call:
|
|
43
|
+
|
|
44
|
+
1. Say what changed.
|
|
45
|
+
2. Tell them what they should now see in the watch link.
|
|
46
|
+
3. In `step-by-step` mode, pause for confirmation before continuing, except after provider selection when entering provider search.
|
|
47
|
+
- Provider-search exception: if the user just approved a provider choice, continue immediately with `get_provider_prompt` + first search (no extra "is it visible?" checkpoint).
|
|
48
|
+
- In `ask-when-needed` or `autonomous` mode, continue unless a required choice is missing.
|
|
49
|
+
|
|
50
|
+
Small variation is fine, but all three elements must be present.
|
|
51
|
+
|
|
52
|
+
### Example Watch Mode Responses
|
|
53
|
+
|
|
54
|
+
- "I moved you to provider selection. You should see that step open in the watch link now. Tell me when you see it."
|
|
55
|
+
- "You are now on the Sales Navigator step. The search panel should be visible in the watch link. Let me know when it's visible."
|
|
56
|
+
|
|
57
|
+
## 4) Offer to Open Watch Link (Only If Possible)
|
|
58
|
+
|
|
59
|
+
Only offer to open the watch link for the user if you actually have a Chrome tool that can open URLs.
|
|
60
|
+
|
|
61
|
+
Rules:
|
|
62
|
+
|
|
63
|
+
- First, check tool availability (for example, via ToolSearch) for a URL-opening Chrome tool.
|
|
64
|
+
- If a URL-opening tool is available, you may say: "I can open the watch link for you if you'd like."
|
|
65
|
+
- If you do not have such a tool, do not mention opening the link.
|
|
66
|
+
|
|
67
|
+
Never imply you opened a browser unless you actually did.
|
|
68
|
+
|
|
69
|
+
## 5) Chrome Debugging Is Conditional
|
|
70
|
+
|
|
71
|
+
Chrome tools are for debugging, not the happy path.
|
|
72
|
+
|
|
73
|
+
Only use Chrome debugging tools when the user signals a problem, such as:
|
|
74
|
+
|
|
75
|
+
- "I don't see it"
|
|
76
|
+
- "Nothing changed"
|
|
77
|
+
- "The page looks wrong"
|
|
78
|
+
|
|
79
|
+
When debugging is needed, prefer:
|
|
80
|
+
|
|
81
|
+
- `mcp__claude-in-chrome__read_page`
|
|
82
|
+
- `mcp__claude-in-chrome__get_page_text`
|
|
83
|
+
|
|
84
|
+
## 6) Wait States + Interaction Modes
|
|
85
|
+
|
|
86
|
+
After showing the campaign watch link (brief step), ask once how they want to run the rest of setup.
|
|
87
|
+
Before presenting choices, explicitly explain there are three interaction modes and that the setting controls how often you pause for confirmation:
|
|
88
|
+
|
|
89
|
+
1. `step-by-step` — confirm each major step
|
|
90
|
+
2. `autonomous` — use best judgment and keep momentum
|
|
91
|
+
3. `ask-when-needed` — ask only when direction is missing
|
|
92
|
+
|
|
93
|
+
If they do not choose clearly, default to `ask-when-needed`.
|
|
94
|
+
|
|
95
|
+
When a step says to wait, you must wait.
|
|
96
|
+
|
|
97
|
+
Do not continue automatically after these checkpoints:
|
|
98
|
+
|
|
99
|
+
- After campaign creation (brief review)
|
|
100
|
+
- After step transitions that affect the UI (`step-by-step` mode), except provider-search immediately after a confirmed provider choice
|
|
101
|
+
- After lead import (`step-by-step` mode)
|
|
102
|
+
|
|
103
|
+
Proceed when the user gives any affirmative response.
|
|
104
|
+
|
|
105
|
+
Mode behavior:
|
|
106
|
+
|
|
107
|
+
- `step-by-step`: require explicit approval for provider choice, import, and post-import transitions. Do not require an extra approval for provider preflight/search once provider choice is confirmed.
|
|
108
|
+
- `autonomous`: proceed through provider preflight/search/import/confirm with best judgment; pause only when a required user decision/tool input is missing.
|
|
109
|
+
- `ask-when-needed`: proceed without repetitive visibility checks; pause at branch decisions or when ambiguity could materially change outcomes.
|
|
110
|
+
|
|
111
|
+
## 7) Provider Extensibility Contract
|
|
112
|
+
|
|
113
|
+
Providers are configured modules. Do not hardcode provider logic when a registry exists.
|
|
114
|
+
|
|
115
|
+
- Use `framework.providers` and `framework.providerRegistry`.
|
|
116
|
+
- Provider selection sets BOTH:
|
|
117
|
+
- `currentStep` (UI navigation)
|
|
118
|
+
- `leadSourceProvider` (backend state)
|
|
119
|
+
- Always call `get_provider_prompt` before provider search.
|
|
120
|
+
|
|
121
|
+
## 8) Customization and Overrides
|
|
122
|
+
|
|
123
|
+
Plugins and overrides are first-class inputs.
|
|
124
|
+
|
|
125
|
+
- Treat plugin context and overrides as user-provided configuration.
|
|
126
|
+
- If plugin overrides conflict with defaults, honor the overrides.
|
|
127
|
+
- Never fabricate overrides or plugin context.
|
|
128
|
+
|
|
129
|
+
## 9) Data Integrity (Non-Negotiable)
|
|
130
|
+
|
|
131
|
+
Never hallucinate social proof, case studies, or metrics.
|
|
132
|
+
|
|
133
|
+
- Use only what is present in tool results or user input.
|
|
134
|
+
- If proof is missing, say "Not provided" and proceed without it.
|
|
135
|
+
|
|
136
|
+
## 10) Deterministic Failure Handling
|
|
137
|
+
|
|
138
|
+
If something required is missing:
|
|
139
|
+
|
|
140
|
+
- Say what is missing
|
|
141
|
+
- Call the tool needed to obtain it
|
|
142
|
+
- Resume the state machine
|
|
143
|
+
|
|
144
|
+
Do not improvise around missing required fields like `clientProspectId`.
|
|
145
|
+
|
|
146
|
+
## 11) User-Directed Research Mode (Allow It)
|
|
147
|
+
|
|
148
|
+
If the user specifies how they want prospect research done, treat it as a hard override.
|
|
149
|
+
|
|
150
|
+
Examples:
|
|
151
|
+
|
|
152
|
+
- "Use Sales Nav first, then Apollo"
|
|
153
|
+
- "Only target these companies"
|
|
154
|
+
- "Filter by React + Series A"
|
|
155
|
+
|
|
156
|
+
Rules:
|
|
157
|
+
|
|
158
|
+
- Follow their plan when it is compatible with required tools and safety rules
|
|
159
|
+
- Still enforce required steps:
|
|
160
|
+
- Set `currentStep`
|
|
161
|
+
- Use watch-mode orientation + wait states
|
|
162
|
+
- Call `get_provider_prompt` before search (when applicable)
|
|
163
|
+
- If their request conflicts with requirements, explain the constraint and propose the closest valid path
|
|
164
|
+
|
|
165
|
+
## 12) Host Parallelism Contract (Claude + Codex)
|
|
166
|
+
|
|
167
|
+
Use the same logical workflow, but route parallel execution by host capability:
|
|
168
|
+
|
|
169
|
+
- If `Task` tool is available: use Task subagents for parallel research/crafting.
|
|
170
|
+
- Else if `multi_tool_use.parallel` is available: batch independent tool calls through `multi_tool_use.parallel`.
|
|
171
|
+
- Else: run the same units sequentially.
|
|
172
|
+
|
|
173
|
+
Rules:
|
|
174
|
+
|
|
175
|
+
- Keep output schema and decision logic identical regardless of backend.
|
|
176
|
+
- Prefer maximal safe parallelism when calls are independent.
|
|
177
|
+
- Never claim Task subagents were launched if you used tool-parallel/sequential execution.
|
|
178
|
+
|
|
179
|
+
## 13) Sender Research Completion Gate (Before create_campaign)
|
|
180
|
+
|
|
181
|
+
For net-new campaign creation, `create_campaign` must not run until sender research is explicitly completed.
|
|
182
|
+
|
|
183
|
+
Required order:
|
|
184
|
+
|
|
185
|
+
1. `enrich_sender`
|
|
186
|
+
2. Company/domain confirmation
|
|
187
|
+
3. `research-sender` execution
|
|
188
|
+
4. `complete_sender_research({ depth, proofItemsFound, caseStudyItemsFound, credibilitySignalsFound, notes? })`
|
|
189
|
+
5. `create_campaign`
|
|
190
|
+
|
|
191
|
+
If the user reruns `enrich_sender`, sender research completion is stale and must be re-done before `create_campaign`.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "apollo",
|
|
3
|
+
"label": "Apollo",
|
|
4
|
+
"leadSourceProvider": "apollo-ai",
|
|
5
|
+
"currentStep": "apollo",
|
|
6
|
+
"promptProvider": "apollo",
|
|
7
|
+
"requiredTools": [
|
|
8
|
+
"update_campaign",
|
|
9
|
+
"get_provider_prompt",
|
|
10
|
+
"search_apollo",
|
|
11
|
+
"import_leads",
|
|
12
|
+
"wait_for_lead_list_ready",
|
|
13
|
+
"confirm_lead_list"
|
|
14
|
+
],
|
|
15
|
+
"watch": {
|
|
16
|
+
"stepVisible": "You should see the Apollo search step open.",
|
|
17
|
+
"afterImport": "You should see Apollo leads appear in the table.",
|
|
18
|
+
"cancelAndRestart": "If the operator realizes the filter is wrong mid-import, call cancel_lead_import with { campaignOfferId, tableId, provider: \"apollo\" } and start a new search with tighter filters."
|
|
19
|
+
},
|
|
20
|
+
"recommendation": {
|
|
21
|
+
"priority": 3,
|
|
22
|
+
"useWhen": [
|
|
23
|
+
"You need technology stack targeting",
|
|
24
|
+
"You need bulk domain list targeting",
|
|
25
|
+
"You need high volume and can accept lower reply rates"
|
|
26
|
+
],
|
|
27
|
+
"avoidWhen": ["High reply rate and LinkedIn activity are the top priority"],
|
|
28
|
+
"reason": "Best for scale and firmographic/technographic filters, but lower LinkedIn activity by default.",
|
|
29
|
+
"prose": "Since you need to find **{icp}**, I'd recommend **Apollo**.\n\nHere's why:\n- Apollo has technology filters that other sources don't\n- We can find people at companies using {techStack}\n- Heads up: reply rates will be lower since not all leads are active on LinkedIn\n\nShould I search Apollo for {techStack} users?"
|
|
30
|
+
},
|
|
31
|
+
"askOption": {
|
|
32
|
+
"label": "Apollo",
|
|
33
|
+
"description": "Large database and powerful filters (lower reply rates)"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "prospeo",
|
|
3
|
+
"label": "Prospeo",
|
|
4
|
+
"leadSourceProvider": "prospeo",
|
|
5
|
+
"currentStep": "prospeo",
|
|
6
|
+
"promptProvider": "prospeo",
|
|
7
|
+
"requiredTools": [
|
|
8
|
+
"update_campaign",
|
|
9
|
+
"get_provider_prompt",
|
|
10
|
+
"search_prospeo",
|
|
11
|
+
"import_leads",
|
|
12
|
+
"wait_for_lead_list_ready",
|
|
13
|
+
"confirm_lead_list"
|
|
14
|
+
],
|
|
15
|
+
"watch": {
|
|
16
|
+
"stepVisible": "You should see the Prospeo search UI.",
|
|
17
|
+
"afterImport": "You should see Prospeo leads in the table.",
|
|
18
|
+
"cancelAndRestart": "If the operator realizes the filter is wrong mid-import, call cancel_lead_import with { campaignOfferId, tableId, provider: \"prospeo\" } and start a new search with tighter filters."
|
|
19
|
+
},
|
|
20
|
+
"recommendation": {
|
|
21
|
+
"priority": 2,
|
|
22
|
+
"useWhen": [
|
|
23
|
+
"You want Prospeo filters or domain-based search",
|
|
24
|
+
"You need high deliverability from Prospeo"
|
|
25
|
+
],
|
|
26
|
+
"avoidWhen": ["You need LinkedIn activity filters"],
|
|
27
|
+
"reason": "Strong for Prospeo-specific filters and domain lists.",
|
|
28
|
+
"prose": "Since you're targeting **{icp}**, I'd recommend **Prospeo**.\n\nHere's why:\n- Prospeo has strong domain-based search and deliverability\n- We can find verified contacts at your target companies\n- Good for high-deliverability outreach\n\nShould I search Prospeo for {icp}?"
|
|
29
|
+
},
|
|
30
|
+
"askOption": {
|
|
31
|
+
"label": "Prospeo",
|
|
32
|
+
"description": "Prospeo search and import"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "v1",
|
|
3
|
+
"defaultProviderOrder": [
|
|
4
|
+
"signal-discovery",
|
|
5
|
+
"sales-nav",
|
|
6
|
+
"prospeo",
|
|
7
|
+
"apollo"
|
|
8
|
+
],
|
|
9
|
+
"providers": [
|
|
10
|
+
{
|
|
11
|
+
"id": "signal-discovery",
|
|
12
|
+
"label": "Signal Discovery",
|
|
13
|
+
"configPath": "mcp/sellable/skills/create-campaign/core/providers/signal-discovery.json"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"id": "sales-nav",
|
|
17
|
+
"label": "Sales Navigator",
|
|
18
|
+
"configPath": "mcp/sellable/skills/create-campaign/core/providers/sales-nav.json"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "prospeo",
|
|
22
|
+
"label": "Prospeo",
|
|
23
|
+
"configPath": "mcp/sellable/skills/create-campaign/core/providers/prospeo.json"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "apollo",
|
|
27
|
+
"label": "Apollo",
|
|
28
|
+
"configPath": "mcp/sellable/skills/create-campaign/core/providers/apollo.json"
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "sales-nav",
|
|
3
|
+
"label": "Sales Navigator",
|
|
4
|
+
"leadSourceProvider": "sales-nav",
|
|
5
|
+
"currentStep": "sales-nav",
|
|
6
|
+
"promptProvider": "sales-nav",
|
|
7
|
+
"requiredTools": [
|
|
8
|
+
"update_campaign",
|
|
9
|
+
"get_provider_prompt",
|
|
10
|
+
"search_sales_nav",
|
|
11
|
+
"import_leads",
|
|
12
|
+
"wait_for_lead_list_ready",
|
|
13
|
+
"confirm_lead_list"
|
|
14
|
+
],
|
|
15
|
+
"watch": {
|
|
16
|
+
"stepVisible": "You should see the Sales Navigator filters and search UI.",
|
|
17
|
+
"afterImport": "You should see Sales Nav leads in the table.",
|
|
18
|
+
"cancelAndRestart": "If the operator realizes the filter is wrong mid-import, call cancel_lead_import with { campaignOfferId, tableId, provider: \"sales-nav\" } and start a new search with tighter filters."
|
|
19
|
+
},
|
|
20
|
+
"recommendation": {
|
|
21
|
+
"priority": 2,
|
|
22
|
+
"useWhen": [
|
|
23
|
+
"ICP is niche or enterprise",
|
|
24
|
+
"You need active LinkedIn users via activity filters",
|
|
25
|
+
"You have account-based targeting needs"
|
|
26
|
+
],
|
|
27
|
+
"avoidWhen": [
|
|
28
|
+
"Signal Discovery can clearly produce enough ICP-fit engagers"
|
|
29
|
+
],
|
|
30
|
+
"reason": "Strong default when public engagement is limited but LinkedIn activity still matters.",
|
|
31
|
+
"prose": "Since you're targeting **{icp}**, I'd recommend **Sales Navigator** with the \"Posted on LinkedIn\" filter.\n\nHere's why:\n- {icp} don't publicly engage much on LinkedIn posts\n- With Sales Nav, we filter for people who recently posted -- 4x more likely to reply\n- Better than a cold database where only ~8% are actually active\n\nShould I search for active {icp} on Sales Navigator?"
|
|
32
|
+
},
|
|
33
|
+
"askOption": {
|
|
34
|
+
"label": "Sales Navigator",
|
|
35
|
+
"description": "Filter for active LinkedIn users and ICP fit"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "signal-discovery",
|
|
3
|
+
"label": "Signal Discovery",
|
|
4
|
+
"leadSourceProvider": "signal-discovery",
|
|
5
|
+
"currentStep": "signal-discovery",
|
|
6
|
+
"promptProvider": "signal-discovery",
|
|
7
|
+
"selection": {
|
|
8
|
+
"promisingPostsTarget": 1
|
|
9
|
+
},
|
|
10
|
+
"requiredTools": [
|
|
11
|
+
"update_campaign",
|
|
12
|
+
"get_provider_prompt",
|
|
13
|
+
"search_signals",
|
|
14
|
+
"select_promising_posts",
|
|
15
|
+
"set_headline_icp_criteria",
|
|
16
|
+
"import_leads",
|
|
17
|
+
"wait_for_lead_list_ready",
|
|
18
|
+
"confirm_lead_list"
|
|
19
|
+
],
|
|
20
|
+
"watch": {
|
|
21
|
+
"stepVisible": "You should see the Signal Discovery step with post search controls.",
|
|
22
|
+
"afterImport": "You should see Signal Discovery leads landing in the table."
|
|
23
|
+
},
|
|
24
|
+
"recommendation": {
|
|
25
|
+
"priority": 1,
|
|
26
|
+
"useWhen": [
|
|
27
|
+
"ICP is active on LinkedIn",
|
|
28
|
+
"You can name the topics they engage with",
|
|
29
|
+
"Quality and reply rate matter more than raw volume"
|
|
30
|
+
],
|
|
31
|
+
"avoidWhen": [
|
|
32
|
+
"ICP rarely engages publicly",
|
|
33
|
+
"User needs very large volume immediately"
|
|
34
|
+
],
|
|
35
|
+
"reason": "Best combination of activity + ICP fit when posts and engagement signals exist.",
|
|
36
|
+
"prose": "Since you're targeting **{icp}**, I'd recommend **Signal Discovery**.\n\nHere's why:\n- {icp} are very active on LinkedIn -- lots of posts about {topics}\n- We find people who engaged with content about your space\n- Warm leads: active on LinkedIn AND interested in your topics\n- 4x higher reply rates vs cold databases\n\nShould I search for posts where {icp} are engaging?"
|
|
37
|
+
},
|
|
38
|
+
"askOption": {
|
|
39
|
+
"label": "Signal Discovery (Recommended)",
|
|
40
|
+
"description": "Find active ICPs engaging with relevant posts"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Campaign Brief Template
|
|
2
|
+
|
|
3
|
+
Use this markdown template when creating the campaign brief for `create_campaign` or `update_campaign_brief`.
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
# [Meeting Value] for [Target Audience]
|
|
7
|
+
|
|
8
|
+
_Example: "Free Pipeline Audit for VPs of Sales" or "Custom Outreach Plan for Marketing Agencies"_
|
|
9
|
+
|
|
10
|
+
## Campaign Objective
|
|
11
|
+
|
|
12
|
+
Launch campaign to **[X persona]** who work at **[Y type of companies]** and offer them **[Z solution/value]**.
|
|
13
|
+
|
|
14
|
+
_Example: "Launch campaign to **VPs of Marketing** who work at **Series A-C SaaS companies** and offer them **AI-powered Google Ads management that cuts CPL by 20%+**."_
|
|
15
|
+
|
|
16
|
+
## Ideal Customer Profile (ICP)
|
|
17
|
+
|
|
18
|
+
- **Company type:** [Specific description]
|
|
19
|
+
- **Role & seniority:** [Titles and levels]
|
|
20
|
+
- **Company size:** [Employee range]
|
|
21
|
+
- **Geography:** [Regions]
|
|
22
|
+
|
|
23
|
+
## Meeting Value (Offer)
|
|
24
|
+
|
|
25
|
+
[The ONE most compelling meeting value for this audience - 2-3 sentences max. Must include:
|
|
26
|
+
(1) tangible deliverable(s) (what they get in the meeting)
|
|
27
|
+
(2) scope/timebox or effort required
|
|
28
|
+
(3) expected outcome tied to the pain
|
|
29
|
+
|
|
30
|
+
Example: "In a 15-minute call, we will audit your top 10 accounts and show where replies are stalling so your SDRs can fix it this week."]
|
|
31
|
+
|
|
32
|
+
## Social Proof
|
|
33
|
+
|
|
34
|
+
**CRITICAL: Use the user's answer to the Proof question. Do NOT make up or modify their answer.**
|
|
35
|
+
|
|
36
|
+
**Primary Proof:** [Copy the user's Proof answer verbatim, or "Not provided - leading with problem"]
|
|
37
|
+
|
|
38
|
+
## Messaging Guidelines
|
|
39
|
+
|
|
40
|
+
- **Lead with:** [Hook based on their posts/news]
|
|
41
|
+
- **Bridge to:** [How it connects to their pain]
|
|
42
|
+
- **Avoid:** [Generic phrases to skip - "best-in-class", "industry-leading", etc.]
|
|
43
|
+
- **Voice:** [Reference sender's voice from `.sellable/configs/writing/styleguide-core.md` if loaded]
|
|
44
|
+
- **Outbound rules:** [Reference `.sellable/configs/writing/outbound.md` if loaded -- observation -> relevance -> ask]
|
|
45
|
+
|
|
46
|
+
## Do NOT Target
|
|
47
|
+
|
|
48
|
+
**Segments to avoid:**
|
|
49
|
+
|
|
50
|
+
- [Competitors' customers if mentioned]
|
|
51
|
+
- [Current customers]
|
|
52
|
+
- [Any exclusions mentioned]
|
|
53
|
+
|
|
54
|
+
## Success Metrics & Stats
|
|
55
|
+
|
|
56
|
+
**Key success stories (if provided):**
|
|
57
|
+
|
|
58
|
+
- [Real metrics from proof answer]
|
|
59
|
+
- [Client transformations mentioned]
|
|
60
|
+
|
|
61
|
+
## Additional Notes
|
|
62
|
+
|
|
63
|
+
[Any other important context from the enrichment or conversation]
|
|
64
|
+
```
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Campaign Quality Patterns
|
|
2
|
+
|
|
3
|
+
This file captures the current Sellable quality bar for campaign briefs, offers,
|
|
4
|
+
and copy direction.
|
|
5
|
+
|
|
6
|
+
## Gold Example Bank
|
|
7
|
+
|
|
8
|
+
These are the highest-trust inspiration sources for Phase 75:
|
|
9
|
+
|
|
10
|
+
- Sellable.dev internal messaging
|
|
11
|
+
- Galley
|
|
12
|
+
- Gelee
|
|
13
|
+
- HeyDigital
|
|
14
|
+
- Revvix / Spektion
|
|
15
|
+
- Superposition
|
|
16
|
+
- Persona Digital
|
|
17
|
+
|
|
18
|
+
Use them for inspiration and contrast, not for cloning.
|
|
19
|
+
|
|
20
|
+
## What Strong Campaigns Consistently Do
|
|
21
|
+
|
|
22
|
+
- Clear over clever. They read smoothly on first pass.
|
|
23
|
+
- Ground the offer in a real job, pain, or moment the buyer already recognizes.
|
|
24
|
+
- Use specific proof only when it is real and relevant.
|
|
25
|
+
- Keep the ask proportional to the prospect's level of intent.
|
|
26
|
+
- Sound like a peer who understands the work, not a marketer narrating value props.
|
|
27
|
+
- Make it easy for the buyer to picture what they get next.
|
|
28
|
+
|
|
29
|
+
## What Weak Campaigns Consistently Do
|
|
30
|
+
|
|
31
|
+
- Hide behind generic offers like "free audit" or "free assessment."
|
|
32
|
+
- Ask for a call before earning enough interest.
|
|
33
|
+
- Lean on vague business outcomes like "grow revenue" or "drive efficiency."
|
|
34
|
+
- Sound templated, over-polished, or AI-clean.
|
|
35
|
+
- Use proof as a flex instead of as context.
|
|
36
|
+
- Fill space with frameworks, jargon, or named methodologies the buyer does not care about.
|
|
37
|
+
|
|
38
|
+
## Brief Quality Checklist
|
|
39
|
+
|
|
40
|
+
A high-quality campaign brief should:
|
|
41
|
+
|
|
42
|
+
- make the target buyer feel precise, not broad
|
|
43
|
+
- define the offer in concrete terms
|
|
44
|
+
- explain why the angle might work now
|
|
45
|
+
- separate what is known from what needs client confirmation
|
|
46
|
+
- preserve real proof without inventing new proof
|
|
47
|
+
- include enough copy guidance that downstream operators do not have to guess
|
|
48
|
+
|
|
49
|
+
## Messaging Quality Checklist
|
|
50
|
+
|
|
51
|
+
Strong message directions usually produce copy that is:
|
|
52
|
+
|
|
53
|
+
- concise without sounding clipped
|
|
54
|
+
- business casual, not corporate
|
|
55
|
+
- specific to the target and the sender
|
|
56
|
+
- easy to read aloud
|
|
57
|
+
- comfortable with slight imperfection when it sounds more human
|
|
58
|
+
|
|
59
|
+
## Openers To Avoid
|
|
60
|
+
|
|
61
|
+
- "Quick question"
|
|
62
|
+
- "I hope this finds you well"
|
|
63
|
+
- cold-opening with a credential or stat
|
|
64
|
+
- "Our approach:"
|
|
65
|
+
- "What if"
|
|
66
|
+
- "Imagine if"
|
|
67
|
+
|
|
68
|
+
## High-Signal Openers To Prefer
|
|
69
|
+
|
|
70
|
+
- soft, conversational first lines
|
|
71
|
+
- relevant observations about the prospect, their role, or a clear signal
|
|
72
|
+
- short lead-ins that earn the right to make an offer
|
|
73
|
+
|
|
74
|
+
Example direction:
|
|
75
|
+
|
|
76
|
+
- Better: "so this might be relevant but..."
|
|
77
|
+
- Better: "not sure if this applies, but..."
|
|
78
|
+
- Better: "this may be a little out of left field, but..."
|
|
79
|
+
- Worse: "we help companies streamline growth with..."
|
|
80
|
+
|
|
81
|
+
## Acceptance Standard
|
|
82
|
+
|
|
83
|
+
If a campaign brief or message direction could be sent by five competitors with a
|
|
84
|
+
name swap, it is not strong enough yet.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Copy Calibration Examples
|
|
2
|
+
|
|
3
|
+
Use this file to calibrate toward strong Sellable output while preserving client
|
|
4
|
+
voice.
|
|
5
|
+
|
|
6
|
+
## Good vs Bad Openers
|
|
7
|
+
|
|
8
|
+
Good:
|
|
9
|
+
|
|
10
|
+
- "so this might be relevant but..."
|
|
11
|
+
- "not sure if this applies, but..."
|
|
12
|
+
- "this may be a bit out of left field, but..."
|
|
13
|
+
|
|
14
|
+
Why good:
|
|
15
|
+
|
|
16
|
+
- softens the opening
|
|
17
|
+
- sounds conversational
|
|
18
|
+
- avoids cold pitch energy
|
|
19
|
+
|
|
20
|
+
Bad:
|
|
21
|
+
|
|
22
|
+
- "Quick question"
|
|
23
|
+
- "I hope this finds you well"
|
|
24
|
+
- "We help companies..."
|
|
25
|
+
- opening cold with a logo, stat, or credential
|
|
26
|
+
|
|
27
|
+
Why bad:
|
|
28
|
+
|
|
29
|
+
- obvious outbound tell
|
|
30
|
+
- feels rehearsed
|
|
31
|
+
- triggers instant pitch pattern-matching
|
|
32
|
+
|
|
33
|
+
## Good vs Bad Proof Usage
|
|
34
|
+
|
|
35
|
+
Good:
|
|
36
|
+
|
|
37
|
+
- one concrete proof point used as context
|
|
38
|
+
- named proof when it matters
|
|
39
|
+
- proof that supports the offer instead of replacing it
|
|
40
|
+
|
|
41
|
+
Bad:
|
|
42
|
+
|
|
43
|
+
- stacked logos and stats before the ask
|
|
44
|
+
- vague claims like "trusted by leading brands"
|
|
45
|
+
- proof used as a flex with no relevance to the buyer
|
|
46
|
+
|
|
47
|
+
## Tone Calibration
|
|
48
|
+
|
|
49
|
+
Target tone:
|
|
50
|
+
|
|
51
|
+
- clear
|
|
52
|
+
- casual but serious
|
|
53
|
+
- readable aloud
|
|
54
|
+
- willing to use fragments or slight imperfection
|
|
55
|
+
|
|
56
|
+
Avoid:
|
|
57
|
+
|
|
58
|
+
- homepage copy
|
|
59
|
+
- poetic phrasing
|
|
60
|
+
- colon-heavy value props
|
|
61
|
+
- dash-connected slogans
|
|
62
|
+
- anything that feels "too nice" instead of clear
|
|
63
|
+
|
|
64
|
+
## Offer Calibration References
|
|
65
|
+
|
|
66
|
+
Galley:
|
|
67
|
+
|
|
68
|
+
- stronger when the output is offered before the meeting
|
|
69
|
+
- weaker when the reply path immediately becomes a scheduling ask
|
|
70
|
+
|
|
71
|
+
HeyDigital:
|
|
72
|
+
|
|
73
|
+
- good reference for simple language, scenario framing, and readability pressure
|
|
74
|
+
|
|
75
|
+
Persona Digital:
|
|
76
|
+
|
|
77
|
+
- good reference for a differentiator that sounds sharp without getting gimmicky
|
|
78
|
+
|
|
79
|
+
Revvix / Spektion:
|
|
80
|
+
|
|
81
|
+
- good reference for category-specific credibility and restraint
|
|
82
|
+
|
|
83
|
+
Superposition:
|
|
84
|
+
|
|
85
|
+
- good reference for founder-story positioning and named proof discipline
|
|
86
|
+
|
|
87
|
+
Sellable.dev:
|
|
88
|
+
|
|
89
|
+
- good reference for smooth internal messaging, low-friction A/B asks, and peer tone
|
|
90
|
+
|
|
91
|
+
## Quick Contrastive Rewrites
|
|
92
|
+
|
|
93
|
+
Weak:
|
|
94
|
+
|
|
95
|
+
- "We help B2B SaaS companies unlock more pipeline through differentiated outbound systems."
|
|
96
|
+
|
|
97
|
+
Better:
|
|
98
|
+
|
|
99
|
+
- "seems like you're already doing the hard part. the gap may just be getting the right people to actually reply."
|
|
100
|
+
|
|
101
|
+
Weak:
|
|
102
|
+
|
|
103
|
+
- "Would you be open to a quick call so I can show you how this works?"
|
|
104
|
+
|
|
105
|
+
Better:
|
|
106
|
+
|
|
107
|
+
- "happy to send over the short version if that's easier. if it looks relevant, we can walk through it live."
|
|
108
|
+
|
|
109
|
+
Weak:
|
|
110
|
+
|
|
111
|
+
- "Our approach: ICP-aligned content that drives qualified attention."
|
|
112
|
+
|
|
113
|
+
Better:
|
|
114
|
+
|
|
115
|
+
- "the difference is the attention is actually from people you'd want to sell to"
|
|
116
|
+
|
|
117
|
+
## Final Check
|
|
118
|
+
|
|
119
|
+
If the client would feel proud to read it and the prospect would not immediately
|
|
120
|
+
clock it as a pitch, it is close. If it sounds clean but generic, keep iterating.
|