@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,258 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: research
|
|
3
|
+
description: Fast parallel research protocol for prospect + sender research.
|
|
4
|
+
visibility: internal
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Research Protocol (Fast + Parallel)
|
|
8
|
+
|
|
9
|
+
This is the shared research flow for **all** skills (craft-message, campaign-messages, enrich-prospects, create-campaign).
|
|
10
|
+
The orchestrator remains the main model (e.g., Opus). Use host-aware parallel execution:
|
|
11
|
+
|
|
12
|
+
- Claude host: `Task` subagents on Sonnet-4.5
|
|
13
|
+
- Codex host: `multi_tool_use.parallel` for independent tool calls
|
|
14
|
+
|
|
15
|
+
## Override Rules
|
|
16
|
+
|
|
17
|
+
1. If the user provides specific research instructions, treat them as a hard override.
|
|
18
|
+
2. Only use `mcp/sellable/skills/research/override.md` if it explicitly includes the marker `OVERRIDE: true`.
|
|
19
|
+
- If the file is missing or only contains the template text, ignore it.
|
|
20
|
+
3. If `mcp/sellable/skills/research/config.json` exists, load it and override defaults below.
|
|
21
|
+
|
|
22
|
+
## Inputs
|
|
23
|
+
|
|
24
|
+
Provide as many as you have. Use `"Unknown"` for missing fields.
|
|
25
|
+
Do not assume workers can read history; explicitly interpolate these inputs into each parallel work unit.
|
|
26
|
+
|
|
27
|
+
- `name`
|
|
28
|
+
- `title`
|
|
29
|
+
- `companyName`
|
|
30
|
+
- `companyLinkedinUrl` (optional)
|
|
31
|
+
- `linkedinUrl`
|
|
32
|
+
- `companyDomain`
|
|
33
|
+
- `experienceSummary`
|
|
34
|
+
- `headline` (sender only)
|
|
35
|
+
- `positioningMode` (boolean)
|
|
36
|
+
- `researchMode` (optional: "sender" | "prospect", default: "prospect")
|
|
37
|
+
- `debugMode` (optional, default: true)
|
|
38
|
+
- `progressMode` (optional, default: true)
|
|
39
|
+
- `parallelMode` (optional, default: "wide")
|
|
40
|
+
|
|
41
|
+
## Execution Backend Routing (Host Capability)
|
|
42
|
+
|
|
43
|
+
Determine execution backend once per run:
|
|
44
|
+
|
|
45
|
+
1. If `Task` tool is available, use `task-subagents` backend.
|
|
46
|
+
2. Else if `multi_tool_use.parallel` is available, use `parallel-tools` backend.
|
|
47
|
+
3. Else use `sequential-tools` backend.
|
|
48
|
+
|
|
49
|
+
Backend rules:
|
|
50
|
+
|
|
51
|
+
- `task-subagents`: use the Task templates below as written.
|
|
52
|
+
- `parallel-tools`: map the same research units to direct tool calls and dispatch independent calls together with `multi_tool_use.parallel`.
|
|
53
|
+
- `sequential-tools`: run the same units one by one while preserving output schema.
|
|
54
|
+
|
|
55
|
+
Never claim Task subagents were launched when using tool-parallel or sequential execution.
|
|
56
|
+
|
|
57
|
+
## Optional Config (config.json)
|
|
58
|
+
|
|
59
|
+
If `mcp/sellable/skills/research/config.json` exists, read it before execution.
|
|
60
|
+
Supported keys (defaults in parentheses):
|
|
61
|
+
|
|
62
|
+
- `parallelMode` ("wide")
|
|
63
|
+
- `agentCount` (6)
|
|
64
|
+
- `maxToolCallsPerAgent` (2)
|
|
65
|
+
- `progressMode` (true)
|
|
66
|
+
- `debugMode` (true)
|
|
67
|
+
|
|
68
|
+
If `agentCount` < 6, drop agents in this order (first dropped first):
|
|
69
|
+
|
|
70
|
+
1. Reviews + Traffic
|
|
71
|
+
2. Company LinkedIn Snapshot
|
|
72
|
+
3. Jobs + Funding
|
|
73
|
+
4. Role Context
|
|
74
|
+
5. Homepage Snapshot
|
|
75
|
+
6. Post Analyzer
|
|
76
|
+
|
|
77
|
+
## Global Performance Rules
|
|
78
|
+
|
|
79
|
+
- For `task-subagents`: spawn **all 6 Sonnet agents in a SINGLE message** for `researchMode="prospect"` using `Task` with `model: "sonnet"`, `subagent_type: "general-purpose"`, and **NO `run_in_background`** (regular Task calls in one message run concurrently; background mode causes notification spam).
|
|
80
|
+
- For `researchMode="sender"`, delegate to the `research-sender` subskill (0-3 agents).
|
|
81
|
+
- For `parallel-tools`: run the same 6 research units (prospect) by batching independent tool calls with `multi_tool_use.parallel`. For sender, delegate to `research-sender`.
|
|
82
|
+
- For `sequential-tools`: run the same units sequentially.
|
|
83
|
+
- **CRITICAL: Launch ALL agents in one message.** Do not launch agents sequentially or wait for one before starting the next. The whole point is parallel execution.
|
|
84
|
+
- Tool budget: **max {maxToolCallsPerAgent} tool calls per agent** (default 2). If you hit the budget, stop and write `None found`.
|
|
85
|
+
- Prefer MCP tools over WebSearch/WebFetch when possible.
|
|
86
|
+
- Avoid duplicate WebFetch across agents (only the Homepage Snapshot agent should fetch the homepage).
|
|
87
|
+
- If inputs are missing or a tool fails, return `Unknown` / `None found` (do NOT add more tool calls).
|
|
88
|
+
|
|
89
|
+
## Mode Switching (sender vs prospect)
|
|
90
|
+
|
|
91
|
+
- `researchMode="sender"`: Delegate to `research-sender` subskill (enrichment-first, 0-3 agents). Do NOT use prospect agent templates.
|
|
92
|
+
- `researchMode="prospect"` (default): Use **Prospect Flow** (hooks + role context).
|
|
93
|
+
|
|
94
|
+
### Progress UX (no-dead-air)
|
|
95
|
+
|
|
96
|
+
If `progressMode=true`:
|
|
97
|
+
|
|
98
|
+
1. Print a one-liner before launching:
|
|
99
|
+
|
|
100
|
+
`Launching 6 research agents in parallel (posts, homepage, LinkedIn, role, growth, reviews)...`
|
|
101
|
+
|
|
102
|
+
2. **In the SAME message**, dispatch all 6 Task calls (no `run_in_background`). Multiple Task calls in one message run concurrently — all 6 launch simultaneously and results return together.
|
|
103
|
+
|
|
104
|
+
3. After all complete, print the synthesis.
|
|
105
|
+
|
|
106
|
+
If `researchMode="sender"`, delegate to `research-sender` subskill (it handles its own progress UX).
|
|
107
|
+
|
|
108
|
+
### Debugging Output
|
|
109
|
+
|
|
110
|
+
Each subagent must include a final line:
|
|
111
|
+
|
|
112
|
+
`DEBUG: tool_calls=[...]; skipped=[...]`
|
|
113
|
+
|
|
114
|
+
If `debugMode=false`, omit the DEBUG line.
|
|
115
|
+
|
|
116
|
+
## Prospect Flow (parallelMode="wide")
|
|
117
|
+
|
|
118
|
+
**CRITICAL: Launch ALL 6 agents in a SINGLE message (no `run_in_background`).** Multiple Task calls in one message run concurrently. All results return together when the last agent finishes. Do NOT use `run_in_background: true` — it causes notification spam.
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
Single message with 6 Task calls (all run concurrently):
|
|
122
|
+
├── Task Agent 1: Post Analyzer
|
|
123
|
+
├── Task Agent 2: Homepage Snapshot
|
|
124
|
+
├── Task Agent 3: Company LinkedIn
|
|
125
|
+
├── Task Agent 4: Role Context
|
|
126
|
+
├── Task Agent 5: Jobs + Funding
|
|
127
|
+
└── Task Agent 6: Reviews + Traffic
|
|
128
|
+
|
|
129
|
+
All 6 results return together → synthesize.
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Agent 1: Post Analyzer
|
|
133
|
+
|
|
134
|
+
```json
|
|
135
|
+
{
|
|
136
|
+
"subagent_type": "general-purpose",
|
|
137
|
+
"model": "sonnet",
|
|
138
|
+
"run_in_background": false,
|
|
139
|
+
"description": "Analyze posts for hooks",
|
|
140
|
+
"prompt": "Analyze LinkedIn posts for {name}.\\n\\nIf linkedinUrl is missing or 'Unknown', do NOT call tools and return (omit DEBUG line if debugMode=false):\\n---\\nTOP THEMES: None found\\nRECENT FOCUS: None found\\nBEST HOOKS: None found\\nENGAGEMENT: None found\\nDEBUG: tool_calls=[]; skipped=[linkedinUrl missing]\\n---\\n\\nOtherwise, call mcp__sellable__fetch_linkedin_posts with:\\n- linkedinUrl: \\\"{linkedinUrl}\\\"\\n- limit: 6\\n\\nThen return EXACTLY (omit DEBUG line if debugMode=false):\\n---\\nTOP THEMES: [3 topics they post about most]\\nRECENT FOCUS: [What's top of mind from last 3 posts]\\nBEST HOOKS: [2 short topics or 1 short quote + 1 topic]\\nENGAGEMENT: [What type of content gets most reactions]\\nDEBUG: tool_calls=[fetch_linkedin_posts]; skipped=[]\\n---\\n\\nKeep under 120 words. Use at most one quote (<=12 words)."
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Agent 2: Homepage Snapshot
|
|
145
|
+
|
|
146
|
+
```json
|
|
147
|
+
{
|
|
148
|
+
"subagent_type": "general-purpose",
|
|
149
|
+
"model": "sonnet",
|
|
150
|
+
"run_in_background": false,
|
|
151
|
+
"description": "Homepage snapshot",
|
|
152
|
+
"prompt": "Capture homepage claims and CTA for {companyName}.\\n\\nIf companyDomain exists, call WebFetch on https://{companyDomain}. Otherwise, do NOT search.\\n\\nReturn EXACTLY (omit DEBUG line if debugMode=false):\\n---\\nWEBSITE: [Key homepage claims + CTA or 'None found']\\nPOSITIONING_HINTS: [Product/category/offer if obvious, else 'Unknown']\\nPROOF: [Logos, metrics, testimonials or 'Unknown']\\nDEBUG: tool_calls=[WebFetch]; skipped=[] (if WebFetch called)\\nDEBUG: tool_calls=[]; skipped=[companyDomain missing] (if not called)\\n---\\n\\nKeep under 90 words."
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Agent 3: Company LinkedIn Snapshot
|
|
157
|
+
|
|
158
|
+
```json
|
|
159
|
+
{
|
|
160
|
+
"subagent_type": "general-purpose",
|
|
161
|
+
"model": "sonnet",
|
|
162
|
+
"run_in_background": false,
|
|
163
|
+
"description": "LinkedIn company snapshot",
|
|
164
|
+
"prompt": "Get LinkedIn company info for {companyName} ({companyDomain}).\\n\\nStep 1: Determine the company LinkedIn URL.\\n- If companyLinkedinUrl is provided and not 'Unknown', use it directly.\\n- Otherwise, do ONE WebSearch query: \\\"site:linkedin.com/company {companyDomain}\\\"\\n- Extract the linkedin.com/company/... URL from search results. If not found, return 'None found' for all fields.\\n\\nStep 2: Call mcp__sellable__fetch_company with the LinkedIn URL.\\n\\nReturn EXACTLY (omit DEBUG line if debugMode=false):\\n---\\nLINKEDIN: [Notable company page info or 'None found']\\nHEADCOUNT_HINTS: [Any size/growth signals or 'Unknown']\\nDEBUG: tool_calls=[WebSearch, fetch_company]; skipped=[] (if both called)\\nDEBUG: tool_calls=[fetch_company]; skipped=[] (if URL was provided)\\nDEBUG: tool_calls=[WebSearch]; skipped=[no LinkedIn URL found] (if search found nothing)\\n---\\n\\nKeep under 90 words."
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Agent 4: Role Context (no tools)
|
|
169
|
+
|
|
170
|
+
```json
|
|
171
|
+
{
|
|
172
|
+
"subagent_type": "general-purpose",
|
|
173
|
+
"model": "sonnet",
|
|
174
|
+
"run_in_background": false,
|
|
175
|
+
"description": "Analyze role context",
|
|
176
|
+
"prompt": "Analyze context for this person with NO tools.\\n\\nName: {name}\\nTitle: {title}\\nCompany: {companyName}\\nExperience: {experienceSummary}\\nHeadline: {headline}\\n\\nReturn EXACTLY (omit DEBUG line if debugMode=false):\\n---\\nROLE\\nPRIORITIES: [Likely TODOs this week]\\nPAIN POINTS: [Common challenges for this role]\\nDECISION POWER: [What they can buy/approve]\\nCONVERSATION STARTERS: [2-3 relevant topics]\\nDEBUG: tool_calls=[]; skipped=[no tools allowed]\\n---\\n\\nKeep under 110 words."
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Agent 5: Jobs + Funding Signals (single search)
|
|
181
|
+
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"subagent_type": "general-purpose",
|
|
185
|
+
"model": "sonnet",
|
|
186
|
+
"run_in_background": false,
|
|
187
|
+
"description": "Jobs and funding signals",
|
|
188
|
+
"prompt": "Gather growth signals for {companyName} ({companyDomain}).\\n\\nDo ONE WebSearch query: \\\"{companyName} jobs careers hiring funding series press release\\\".\\n\\nReturn EXACTLY (omit DEBUG line if debugMode=false):\\n---\\nHIRING: [Notable job titles/teams or 'None found']\\nFUNDING: [Round, amount, date or 'None found']\\nPRESS: [Recent announcement or 'None found']\\nDEBUG: tool_calls=[WebSearch]; skipped=[]\\n---\\n\\nKeep under 100 words."
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Agent 6: Reviews + Traffic (single search)
|
|
193
|
+
|
|
194
|
+
```json
|
|
195
|
+
{
|
|
196
|
+
"subagent_type": "general-purpose",
|
|
197
|
+
"model": "sonnet",
|
|
198
|
+
"run_in_background": false,
|
|
199
|
+
"description": "Reviews and traffic signals",
|
|
200
|
+
"prompt": "Find reviews/traffic for {companyName}.\\n\\nDo ONE WebSearch query: \\\"{companyName} G2 reviews Capterra TrustRadius Similarweb traffic\\\".\\n\\nReturn EXACTLY (omit DEBUG line if debugMode=false):\\n---\\nREVIEWS: [G2/other review signal or 'None found']\\nTRAFFIC: [Traffic estimate source or 'None found']\\nDEBUG: tool_calls=[WebSearch]; skipped=[]\\n---\\n\\nKeep under 80 words."
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Sender Flow (parallelMode="wide")
|
|
205
|
+
|
|
206
|
+
**Sender research uses the dedicated `research-sender` subskill.**
|
|
207
|
+
|
|
208
|
+
When `researchMode="sender"`:
|
|
209
|
+
|
|
210
|
+
1. Load via `get_subskill_prompt({ subskillName: "research-sender" })`
|
|
211
|
+
2. Follow its instructions — it handles enrichment-first logic and conditional agent spawning
|
|
212
|
+
3. Do NOT use the prospect agent templates below for sender research
|
|
213
|
+
|
|
214
|
+
## Synthesize Results (Orchestrator)
|
|
215
|
+
|
|
216
|
+
After all agents return, combine into a short Research Notes block. **Strip DEBUG lines before final output.**
|
|
217
|
+
|
|
218
|
+
**If researchMode="sender":** Handled by `research-sender` subskill — do not synthesize here.
|
|
219
|
+
|
|
220
|
+
**If researchMode="prospect":**
|
|
221
|
+
|
|
222
|
+
If the caller passed cross-skill insights (from `.sellable/insights/cross-skill.md`), use them to prioritize hooks — e.g., if engage sessions show "AI compute time" angles get high engagement, rank those hooks higher.
|
|
223
|
+
|
|
224
|
+
```markdown
|
|
225
|
+
## {Name} - {Title} at {Company}
|
|
226
|
+
|
|
227
|
+
**Top of Mind:** [From post analysis]
|
|
228
|
+
**Company Context:** [From homepage + LinkedIn + reviews/traffic]
|
|
229
|
+
**Pain Points:** [From role analysis]
|
|
230
|
+
|
|
231
|
+
**Hooks to Use:**
|
|
232
|
+
|
|
233
|
+
- [Specific post quote or topic]
|
|
234
|
+
- [Recent company news angle]
|
|
235
|
+
- [Role-specific conversation starter]
|
|
236
|
+
- [Cross-skill insight angle, if relevant]
|
|
237
|
+
|
|
238
|
+
**Growth Signals:**
|
|
239
|
+
|
|
240
|
+
- [Hiring signal]
|
|
241
|
+
- [Funding signal]
|
|
242
|
+
- [Press signal]
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
If `positioningMode=true` and WEBSITE is not "None found":
|
|
246
|
+
|
|
247
|
+
- For **prospect mode**, append the Positioning Notes block below.
|
|
248
|
+
- For **sender mode**, populate the **Positioning Notes** line inside the sender summary using these fields.
|
|
249
|
+
|
|
250
|
+
```markdown
|
|
251
|
+
**Positioning Notes:**
|
|
252
|
+
|
|
253
|
+
- OFFER: ...
|
|
254
|
+
- TARGET: ...
|
|
255
|
+
- PAINS: ...
|
|
256
|
+
- PROOF: ...
|
|
257
|
+
- DIFF: ...
|
|
258
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Research Override (Optional)
|
|
2
|
+
|
|
3
|
+
OVERRIDE: false
|
|
4
|
+
|
|
5
|
+
If you want to replace the default sonnet research protocol, put your custom
|
|
6
|
+
instructions here. The `research` subskill will treat this file as authoritative.
|
|
7
|
+
|
|
8
|
+
This file is intentionally empty by default. To activate, set `OVERRIDE: true`
|
|
9
|
+
and replace the template with your own rules, prompts, and
|
|
10
|
+
formats to override:
|
|
11
|
+
|
|
12
|
+
- Prospect Research Pattern
|
|
13
|
+
- Sender + Positioning Research Pattern
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: research-prospect
|
|
3
|
+
description: Dedicated prospect research protocol for hooks, context, and personalization.
|
|
4
|
+
visibility: internal
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Research Prospect (Dedicated)
|
|
8
|
+
|
|
9
|
+
Use this subskill for lead/prospect research before message drafting.
|
|
10
|
+
This protocol is standalone and does not depend on the generic `research` subskill.
|
|
11
|
+
|
|
12
|
+
## Objective
|
|
13
|
+
|
|
14
|
+
Produce high-signal prospect context for outreach:
|
|
15
|
+
|
|
16
|
+
- What they care about (posts/themes)
|
|
17
|
+
- Company context and momentum
|
|
18
|
+
- Personalization hooks and conversation starters
|
|
19
|
+
|
|
20
|
+
## Inputs
|
|
21
|
+
|
|
22
|
+
Provide as many as available. Use `"Unknown"` when missing.
|
|
23
|
+
|
|
24
|
+
- `name`
|
|
25
|
+
- `title`
|
|
26
|
+
- `companyName`
|
|
27
|
+
- `companyDomain`
|
|
28
|
+
- `companyLinkedinUrl` (optional)
|
|
29
|
+
- `linkedinUrl` (optional)
|
|
30
|
+
- `experienceSummary` (optional)
|
|
31
|
+
|
|
32
|
+
## Execution Backend Routing
|
|
33
|
+
|
|
34
|
+
Choose backend once:
|
|
35
|
+
|
|
36
|
+
1. If `Task` is available: use Task subagents in parallel.
|
|
37
|
+
2. Else if `multi_tool_use.parallel` is available: batch independent tool calls via `multi_tool_use.parallel`.
|
|
38
|
+
3. Else: run units sequentially.
|
|
39
|
+
|
|
40
|
+
Never claim Task subagents were used when they were not.
|
|
41
|
+
|
|
42
|
+
## Evidence Retrieval Routing (Web)
|
|
43
|
+
|
|
44
|
+
Use host-native web tools for external context:
|
|
45
|
+
|
|
46
|
+
- Claude host: use `WebSearch` + `WebFetch`.
|
|
47
|
+
- Codex host: use `web.search_query` + `web.open`.
|
|
48
|
+
|
|
49
|
+
Hard rule:
|
|
50
|
+
|
|
51
|
+
- Do NOT use shell scraping for research extraction (`curl`, `_next` bundle grep, JS chunk scanning).
|
|
52
|
+
- If a page is JS-heavy and unreadable, pivot to alternate sources and explicitly mark what remained unavailable.
|
|
53
|
+
|
|
54
|
+
## Research Units (6)
|
|
55
|
+
|
|
56
|
+
Run these units with maximal safe parallelism for the selected backend.
|
|
57
|
+
|
|
58
|
+
1. Post Analyzer
|
|
59
|
+
|
|
60
|
+
- Use LinkedIn posts when `linkedinUrl` exists.
|
|
61
|
+
- Extract top themes, recent focus, and best hooks.
|
|
62
|
+
|
|
63
|
+
2. Homepage Snapshot
|
|
64
|
+
|
|
65
|
+
- Fetch company homepage when domain exists.
|
|
66
|
+
- Extract positioning/proof hints.
|
|
67
|
+
|
|
68
|
+
3. Company LinkedIn Snapshot
|
|
69
|
+
|
|
70
|
+
- Resolve company LinkedIn URL if needed, then call `fetch_company`.
|
|
71
|
+
- Extract company context and headcount hints.
|
|
72
|
+
|
|
73
|
+
4. Role Context (No Tools)
|
|
74
|
+
|
|
75
|
+
- Infer likely priorities, pains, and decision context from role/title.
|
|
76
|
+
|
|
77
|
+
5. Jobs + Funding Signals
|
|
78
|
+
|
|
79
|
+
- Search hiring/funding/press momentum.
|
|
80
|
+
|
|
81
|
+
6. Reviews + Traffic Signals
|
|
82
|
+
|
|
83
|
+
- Search review and traffic indicators.
|
|
84
|
+
|
|
85
|
+
## Output
|
|
86
|
+
|
|
87
|
+
Return exactly this structure:
|
|
88
|
+
|
|
89
|
+
```markdown
|
|
90
|
+
## {Name} - {Title} at {Company}
|
|
91
|
+
|
|
92
|
+
**Top of Mind:** [...]
|
|
93
|
+
**Company Context:** [...]
|
|
94
|
+
**Pain Points:** [...]
|
|
95
|
+
**Hooks to Use:** [...]
|
|
96
|
+
**Growth Signals:** [...]
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
If data is missing, use `None found` rather than guessing.
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: research-sender
|
|
3
|
+
description: Enrichment-first sender research protocol. 0-3 agents, 30s target.
|
|
4
|
+
visibility: internal
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Research Sender (Enrichment-First)
|
|
8
|
+
|
|
9
|
+
Use this subskill when creating campaigns and you need sender/company research.
|
|
10
|
+
This protocol is standalone and does not depend on the generic `research` subskill.
|
|
11
|
+
|
|
12
|
+
## Core Architecture
|
|
13
|
+
|
|
14
|
+
`enrich_sender` compact mode already returns `companySnapshot`, `senderBackground`, and `proofDigest`.
|
|
15
|
+
Four of the old five research agents duplicated this data. Only Growth Signals + Case Studies are net-new.
|
|
16
|
+
When `companySnapshot.description` is missing/thin, we also run a tiny positioning snippet pass (1 WebSearch) so we don't end up with blank company context.
|
|
17
|
+
|
|
18
|
+
**This protocol uses enrichment as the baseline and only spawns extra work when proof or positioning context is missing.**
|
|
19
|
+
|
|
20
|
+
## Inputs
|
|
21
|
+
|
|
22
|
+
Provide as many as available. Use `"Unknown"` for missing values.
|
|
23
|
+
|
|
24
|
+
- `name`
|
|
25
|
+
- `title`
|
|
26
|
+
- `companyName`
|
|
27
|
+
- `companyDomain`
|
|
28
|
+
- `companyLinkedinUrl` (optional)
|
|
29
|
+
- `linkedinUrl` (optional)
|
|
30
|
+
- `headline` (optional)
|
|
31
|
+
- `enrichSender` response (REQUIRED — must include `companySnapshot`, `senderBackground`, `proofDigest`)
|
|
32
|
+
|
|
33
|
+
## Depth Decision (Deterministic — from proofDigest)
|
|
34
|
+
|
|
35
|
+
Check the `proofDigest` from the `enrich_sender` compact response:
|
|
36
|
+
|
|
37
|
+
### `minimal-verification` (0-1 agent, 0-1 web calls, ~2-10 seconds)
|
|
38
|
+
|
|
39
|
+
**Condition:** `proofDigest.caseStudyCount > 0` AND `proofDigest.reviewHighlight` exists (not null)
|
|
40
|
+
|
|
41
|
+
- Do NOT spawn proof/growth agents (Case Studies, Growth Signals).
|
|
42
|
+
- If `companySnapshot.description` is missing/thin, spawn the **Company Positioning** agent (1 WebSearch, no WebFetch).
|
|
43
|
+
- Synthesize directly from enrichment data (companySnapshot + senderBackground + proofDigest) plus Agent 3 if used.
|
|
44
|
+
- Call `complete_sender_research()` immediately with enrichment counts.
|
|
45
|
+
- ~0 additional tokens.
|
|
46
|
+
|
|
47
|
+
### `deep-proof` (2-3 agents in parallel, max 5 tool calls total, ~30 seconds)
|
|
48
|
+
|
|
49
|
+
**Condition:** `proofDigest.caseStudyCount === 0` OR `proofDigest.reviewHighlight` is null
|
|
50
|
+
|
|
51
|
+
- Spawn exactly **2 agents in parallel** (Case Studies + Growth Signals).
|
|
52
|
+
- If `companySnapshot.description` is missing/thin, also spawn **1 positioning agent** (Company Positioning) in parallel.
|
|
53
|
+
- Homepage, Company LinkedIn, Reviews → all covered by enrichment, skip these entirely.
|
|
54
|
+
- ~100k tokens total.
|
|
55
|
+
|
|
56
|
+
## Positioning Context (Conditional — from companySnapshot.description)
|
|
57
|
+
|
|
58
|
+
If `companySnapshot.description` is null/undefined or shorter than ~120 characters, run the **Company Positioning** agent (1 WebSearch, no WebFetch).
|
|
59
|
+
|
|
60
|
+
## Execution Backend Routing
|
|
61
|
+
|
|
62
|
+
Choose backend once:
|
|
63
|
+
|
|
64
|
+
1. If `Task` is available: use Task subagents in parallel (Claude host).
|
|
65
|
+
2. Else if `multi_tool_use.parallel` is available: batch independent tool calls (Codex host).
|
|
66
|
+
3. Else: run units sequentially.
|
|
67
|
+
|
|
68
|
+
Never claim Task subagents were used when they were not.
|
|
69
|
+
|
|
70
|
+
## Agent Prompts (when needed)
|
|
71
|
+
|
|
72
|
+
### Agent 1: Case Studies + Proof (max 3 tool calls)
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"subagent_type": "general-purpose",
|
|
77
|
+
"model": "haiku",
|
|
78
|
+
"description": "Case studies and proof",
|
|
79
|
+
"prompt": "Find 1-3 concrete proof items for {companyName} ({companyDomain}).\n\nUse only: WebSearch, WebFetch.\n\nTool budget:\n- 1 WebSearch\n- Up to 2 WebFetch (only if the page looks like a case study/testimonial with named customers or metrics)\n\nWebSearch query (run exactly once):\nsite:{companyDomain} (\"case study\" OR \"customer story\" OR testimonial OR results OR \"success story\") \"{companyName}\"\n\nWebFetch: pick up to 2 results that look most likely to contain named customers or metrics.\nIf a fetched page is JS-heavy/empty, skip it and use snippets.\nDo not do a second search.\n\nReturn EXACTLY:\n---\nPROOF_OPTIONS: [Up to 3 items. Each: customer + outcome/metric + timeframe if present; or 'None found']\nSOURCES: [Short source hints]\n---\nKeep under 120 words. No extra commentary."
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Agent 2: Growth/Credibility Signals (max 1 tool call)
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"subagent_type": "general-purpose",
|
|
88
|
+
"model": "haiku",
|
|
89
|
+
"description": "Growth and credibility signals",
|
|
90
|
+
"prompt": "Find recent growth/credibility signals for {companyName} ({companyDomain}).\n\nUse only: WebSearch.\nTool budget: 1 WebSearch.\n\nWebSearch query (run exactly once):\n\"{companyName}\" {companyDomain} {currentYear} (funding OR raised OR seed OR series OR hiring OR \"we're hiring\" OR launch OR announcement OR \"press release\")\n\nReturn EXACTLY:\n---\nHIRING: [Notable signals or 'None found']\nFUNDING: [Round, amount, date or 'None found']\nPRESS: [Recent announcement or 'None found']\n---\nKeep under 90 words. No extra commentary."
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Agent 3: Company Positioning (max 1 tool call)
|
|
95
|
+
|
|
96
|
+
```json
|
|
97
|
+
{
|
|
98
|
+
"subagent_type": "general-purpose",
|
|
99
|
+
"model": "haiku",
|
|
100
|
+
"description": "Company positioning context",
|
|
101
|
+
"prompt": "If the enrichment company description is missing/thin, pull a crisp positioning summary for {companyName} ({companyDomain}) using only search snippets.\n\nUse only: WebSearch.\nTool budget: 1 WebSearch.\n\nWebSearch query (run exactly once):\n\"{companyName}\" about product site:{companyDomain}\n\nReturn EXACTLY:\n---\nPOSITIONING: [1-2 sentences]\nICP: [1 short line, or 'Unknown']\nDIFFERENTIATORS: [Up to 3 short bullets, or 'Unknown']\nSOURCES: [Short source hints]\n---\nKeep under 90 words. No extra commentary."
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Synthesis (Orchestrator — No Agents)
|
|
106
|
+
|
|
107
|
+
After agents return (or immediately for minimal-verification), merge enrichment baseline + agent findings:
|
|
108
|
+
|
|
109
|
+
```markdown
|
|
110
|
+
## {Company} - Sender Research
|
|
111
|
+
|
|
112
|
+
**Company Context:** [companySnapshot.description OR Agent 3 POSITIONING] + [companySnapshot.industry + employeeRange]
|
|
113
|
+
**Positioning Notes:** [proofDigest.positioningOneLiner + keyDifferentiators + Agent 3 DIFFERENTIATORS (if present)]
|
|
114
|
+
**Proof Options:** [proofDigest.caseStudySummary + agent upgrades if deep-proof]
|
|
115
|
+
**Credibility Signals:** [proofDigest.reviewHighlight + agent growth signals if deep-proof]
|
|
116
|
+
**Gaps:** [what's missing]
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Completion Marker (Required)
|
|
120
|
+
|
|
121
|
+
After synthesis, call:
|
|
122
|
+
|
|
123
|
+
`complete_sender_research({ depth, proofItemsFound, caseStudyItemsFound, credibilitySignalsFound, notes? })`
|
|
124
|
+
|
|
125
|
+
Count rules:
|
|
126
|
+
|
|
127
|
+
- `depth`: "minimal-verification" or "deep-proof"
|
|
128
|
+
- `proofItemsFound`: number of concrete proof items you would confidently use.
|
|
129
|
+
- `caseStudyItemsFound`: number of usable case-study examples.
|
|
130
|
+
- `credibilitySignalsFound`: number of trust signals (reviews/ratings/funding/hiring/press).
|
|
131
|
+
|
|
132
|
+
If no reliable evidence is found, set counts to 0 and include that in `notes`.
|
|
133
|
+
|
|
134
|
+
## Progress UX
|
|
135
|
+
|
|
136
|
+
If launching deep-proof agents:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
Running a quick research pass for case studies and growth signals (~30s)...
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
If also launching the Company Positioning agent:
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
Running a quick research pass for case studies, growth signals, and positioning (~30s)...
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
If only launching the Company Positioning agent:
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
Pulling a quick positioning summary from search snippets (~10s)...
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
If skipping agents (minimal-verification):
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
Enrichment already has strong proof — synthesizing directly from baseline data.
|
|
158
|
+
```
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: workflow-sequences
|
|
3
|
+
description: Create workflow tables via Sellable MCP, attach outbound sequence templates, inspect existing tables, and handle overwrite or starter-column compatibility issues safely.
|
|
4
|
+
visibility: public
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Workflow Sequences
|
|
8
|
+
|
|
9
|
+
Use this when the user wants to create a workflow table for sequencing, attach or replace a sequence template, or inspect which tables already have sequences.
|
|
10
|
+
|
|
11
|
+
This is the canonical MCP workflow for creating sequencer tables. Prefer this over manually creating workflow table columns or hand-writing sequence `runCondition` expressions.
|
|
12
|
+
|
|
13
|
+
## Tools
|
|
14
|
+
|
|
15
|
+
- `mcp__sellable__get_auth_status`
|
|
16
|
+
- `mcp__sellable__list_senders`
|
|
17
|
+
- `mcp__sellable__list_tables`
|
|
18
|
+
- `mcp__sellable__create_workflow_table`
|
|
19
|
+
- `mcp__sellable__attach_sequence`
|
|
20
|
+
|
|
21
|
+
## Workflow
|
|
22
|
+
|
|
23
|
+
1. Call `mcp__sellable__get_auth_status({})`.
|
|
24
|
+
- If auth is not OK, stop and show the returned guidance.
|
|
25
|
+
2. Resolve a sender.
|
|
26
|
+
- If the user supplied a sender id, use it.
|
|
27
|
+
- Otherwise call `mcp__sellable__list_senders()` and use the only sender or ask the user to choose.
|
|
28
|
+
3. Decide whether to create a new table or reuse an existing one.
|
|
29
|
+
- Prefer `create_workflow_table` for new sequence work.
|
|
30
|
+
- Use `list_tables` when the user wants to reuse or inspect existing tables.
|
|
31
|
+
4. When creating a new table, pass `sequenceActions` that cover every action node you expect to attach later.
|
|
32
|
+
- This create path produces a lightweight `CampaignOffer + WorkflowTable` shell for durable user-facing workflow work.
|
|
33
|
+
- `campaignBrief`, rubrics, positioning, and client prospect linkage are optional unless the user asks for them.
|
|
34
|
+
- `DM` needs a `Message` column.
|
|
35
|
+
- `INMAIL_OPEN` and `INMAIL_CLOSED` need `Subject` and `Message`.
|
|
36
|
+
- `COMMENT` needs `Post URL` and `Comment`.
|
|
37
|
+
- `Reaction Type` is optional for `COMMENT`.
|
|
38
|
+
5. Do not reuse an incompatible table just because it exists.
|
|
39
|
+
- A table missing the required starter columns will now reject `attach_sequence` with `Table is missing required starter columns`.
|
|
40
|
+
- If the user wants a `COMMENT` sequence and the table was created for `INVITE` or `DM`, create a fresh table instead of forcing replacement.
|
|
41
|
+
6. Call `mcp__sellable__attach_sequence({ tableId, template, confirmed? })`.
|
|
42
|
+
- Template must use `version: 2`.
|
|
43
|
+
- `entryNodeId` must match a node id in `nodes`.
|
|
44
|
+
- `nodes` must be non-empty.
|
|
45
|
+
- Express branching in the template only. Do not hand-author raw `runCondition` strings for sequence columns.
|
|
46
|
+
7. Treat overwrite as explicit user intent.
|
|
47
|
+
- If `attach_sequence` returns `SEQUENCE_EXISTS`, explain that sequence columns already exist.
|
|
48
|
+
- Only retry with `confirmed: true` when the user wants to replace the existing sequence.
|
|
49
|
+
|
|
50
|
+
## Business Rules
|
|
51
|
+
|
|
52
|
+
- `DM` must be reachable only after an accepted invite path or an `If Connected` yes-path.
|
|
53
|
+
- `INMAIL_OPEN` must be on the `If Open Profile` yes-path.
|
|
54
|
+
- Unsupported table types return `Table type does not support sequences`.
|
|
55
|
+
- Missing workspace context means the active workspace is not set correctly.
|
|
56
|
+
|
|
57
|
+
## Run Conditions
|
|
58
|
+
|
|
59
|
+
- The MCP caller should not write sequence column `runCondition` expressions manually.
|
|
60
|
+
- The backend derives `runCondition` from the sequence template branches.
|
|
61
|
+
- Canonical branch mappings are:
|
|
62
|
+
- `is_open_profile` yes/no -> `.is_open === true/false`
|
|
63
|
+
- `is_connected` yes/no -> `.is_connected === true/false`
|
|
64
|
+
- action `accepted`, `replied`, `timeout`, `no_reply` -> `.value === true/false`
|
|
65
|
+
- If a user asks to edit raw conditions directly, explain that sequence logic should be expressed as branches in the template instead.
|
|
66
|
+
|
|
67
|
+
## Good Defaults
|
|
68
|
+
|
|
69
|
+
- Start with `create_workflow_table` for every new sequence workflow.
|
|
70
|
+
- Treat new user-facing workflow tables as campaign-backed by default, not as bare standalone tables.
|
|
71
|
+
- Pass `sequenceActions` that cover every action node you plan to attach.
|
|
72
|
+
- Recommended first scenarios:
|
|
73
|
+
- `INVITE` only
|
|
74
|
+
- `INVITE -> accepted -> DM`
|
|
75
|
+
- `COMMENT` only
|
|
76
|
+
- `If Open Profile -> INMAIL_OPEN, else INVITE`
|
|
77
|
+
|
|
78
|
+
## Output
|
|
79
|
+
|
|
80
|
+
Return:
|
|
81
|
+
|
|
82
|
+
- `tableId`
|
|
83
|
+
- `campaignOfferId` when a new table is created
|
|
84
|
+
- whether a sequence was attached or replaced
|
|
85
|
+
- any blocker with the exact MCP or API guidance that should drive the next step
|