@sellable/mcp 0.1.273 → 0.1.275
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 +14 -3
- package/dist/index-dev.js +0 -0
- package/dist/index.js +0 -0
- package/dist/server.js +17 -0
- package/dist/tools/campaign-ab-test.d.ts +72 -0
- package/dist/tools/campaign-ab-test.js +60 -0
- package/dist/tools/csv-linkedin.d.ts +23 -0
- package/dist/tools/csv-linkedin.js +167 -7
- package/dist/tools/harvest-jobs.d.ts +182 -0
- package/dist/tools/harvest-jobs.js +429 -0
- package/dist/tools/leads.d.ts +6 -0
- package/dist/tools/leads.js +9 -1
- package/dist/tools/prompts.d.ts +3 -3
- package/dist/tools/prompts.js +1 -0
- package/dist/tools/registry.d.ts +105 -2
- package/dist/tools/registry.js +4 -0
- package/package.json +1 -1
- package/skills/create-ab-test/SKILL.md +77 -0
- package/skills/create-campaign/SKILL.md +26 -0
- package/skills/create-campaign/core/providers/prospeo.json +5 -2
- package/skills/generate-messages/SKILL.md +10 -0
- package/skills/providers/prospeo.md +21 -0
- package/skills/research/config.json +0 -9
package/dist/tools/prompts.d.ts
CHANGED
|
@@ -135,7 +135,7 @@ export interface PostFindLeadsScoutRegistryResponse {
|
|
|
135
135
|
}
|
|
136
136
|
export declare const DEFAULT_SUBSKILL_PROMPT_CHUNK_CHARS = 48000;
|
|
137
137
|
export declare const MAX_SUBSKILL_PROMPT_CHUNK_CHARS = 48000;
|
|
138
|
-
export declare const ALLOWED_SUBSKILL_PROMPT_NAMES: readonly ["building-gtm-tables", "content", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
138
|
+
export declare const ALLOWED_SUBSKILL_PROMPT_NAMES: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
139
139
|
export declare const promptToolDefinitions: ({
|
|
140
140
|
name: string;
|
|
141
141
|
description: string;
|
|
@@ -179,7 +179,7 @@ export declare const promptToolDefinitions: ({
|
|
|
179
179
|
properties: {
|
|
180
180
|
subskillName: {
|
|
181
181
|
type: string;
|
|
182
|
-
enum: readonly ["building-gtm-tables", "content", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
182
|
+
enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
183
183
|
description: string;
|
|
184
184
|
};
|
|
185
185
|
offset: {
|
|
@@ -214,7 +214,7 @@ export declare const promptToolDefinitions: ({
|
|
|
214
214
|
properties: {
|
|
215
215
|
subskillName: {
|
|
216
216
|
type: string;
|
|
217
|
-
enum: readonly ["building-gtm-tables", "content", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
217
|
+
enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
218
218
|
description: string;
|
|
219
219
|
};
|
|
220
220
|
assetPath: {
|
package/dist/tools/prompts.js
CHANGED
package/dist/tools/registry.d.ts
CHANGED
|
@@ -225,7 +225,7 @@ export declare const allTools: ({
|
|
|
225
225
|
properties: {
|
|
226
226
|
subskillName: {
|
|
227
227
|
type: string;
|
|
228
|
-
enum: readonly ["building-gtm-tables", "content", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
228
|
+
enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
229
229
|
description: string;
|
|
230
230
|
};
|
|
231
231
|
offset: {
|
|
@@ -260,7 +260,7 @@ export declare const allTools: ({
|
|
|
260
260
|
properties: {
|
|
261
261
|
subskillName: {
|
|
262
262
|
type: string;
|
|
263
|
-
enum: readonly ["building-gtm-tables", "content", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
263
|
+
enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-post", "create-rubric", "engage", "enrich-prospects", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "research", "research-prospect", "research-sender", "workflow-sequences"];
|
|
264
264
|
description: string;
|
|
265
265
|
};
|
|
266
266
|
assetPath: {
|
|
@@ -1140,6 +1140,62 @@ export declare const allTools: ({
|
|
|
1140
1140
|
required: string[];
|
|
1141
1141
|
additionalProperties?: undefined;
|
|
1142
1142
|
};
|
|
1143
|
+
} | {
|
|
1144
|
+
name: string;
|
|
1145
|
+
description: string;
|
|
1146
|
+
inputSchema: {
|
|
1147
|
+
type: string;
|
|
1148
|
+
properties: {
|
|
1149
|
+
sourceCampaignId: {
|
|
1150
|
+
type: string;
|
|
1151
|
+
description: string;
|
|
1152
|
+
};
|
|
1153
|
+
variantName: {
|
|
1154
|
+
type: string;
|
|
1155
|
+
description: string;
|
|
1156
|
+
};
|
|
1157
|
+
variantBriefDelta: {
|
|
1158
|
+
type: string;
|
|
1159
|
+
description: string;
|
|
1160
|
+
};
|
|
1161
|
+
variantALabel: {
|
|
1162
|
+
type: string;
|
|
1163
|
+
description: string;
|
|
1164
|
+
};
|
|
1165
|
+
variantABriefDelta: {
|
|
1166
|
+
type: string;
|
|
1167
|
+
description: string;
|
|
1168
|
+
};
|
|
1169
|
+
splitStrategy: {
|
|
1170
|
+
type: string;
|
|
1171
|
+
enum: string[];
|
|
1172
|
+
description: string;
|
|
1173
|
+
};
|
|
1174
|
+
targetCounts: {
|
|
1175
|
+
type: string;
|
|
1176
|
+
properties: {
|
|
1177
|
+
a: {
|
|
1178
|
+
type: string;
|
|
1179
|
+
};
|
|
1180
|
+
b: {
|
|
1181
|
+
type: string;
|
|
1182
|
+
};
|
|
1183
|
+
};
|
|
1184
|
+
additionalProperties: boolean;
|
|
1185
|
+
description: string;
|
|
1186
|
+
};
|
|
1187
|
+
dryRun: {
|
|
1188
|
+
type: string;
|
|
1189
|
+
description: string;
|
|
1190
|
+
};
|
|
1191
|
+
idempotencyKey: {
|
|
1192
|
+
type: string;
|
|
1193
|
+
description: string;
|
|
1194
|
+
};
|
|
1195
|
+
};
|
|
1196
|
+
required: string[];
|
|
1197
|
+
additionalProperties: boolean;
|
|
1198
|
+
};
|
|
1143
1199
|
} | {
|
|
1144
1200
|
name: string;
|
|
1145
1201
|
description: string;
|
|
@@ -1956,6 +2012,53 @@ export declare const allTools: ({
|
|
|
1956
2012
|
};
|
|
1957
2013
|
required: never[];
|
|
1958
2014
|
};
|
|
2015
|
+
} | {
|
|
2016
|
+
name: string;
|
|
2017
|
+
description: string;
|
|
2018
|
+
inputSchema: {
|
|
2019
|
+
type: string;
|
|
2020
|
+
properties: {
|
|
2021
|
+
searchToken: {
|
|
2022
|
+
type: string;
|
|
2023
|
+
description: string;
|
|
2024
|
+
};
|
|
2025
|
+
selectedJobIds: {
|
|
2026
|
+
type: string;
|
|
2027
|
+
items: {
|
|
2028
|
+
type: string;
|
|
2029
|
+
};
|
|
2030
|
+
description: string;
|
|
2031
|
+
};
|
|
2032
|
+
name: {
|
|
2033
|
+
type: string;
|
|
2034
|
+
};
|
|
2035
|
+
outputDir: {
|
|
2036
|
+
type: string;
|
|
2037
|
+
description: string;
|
|
2038
|
+
};
|
|
2039
|
+
fileBaseName: {
|
|
2040
|
+
type: string;
|
|
2041
|
+
description: string;
|
|
2042
|
+
};
|
|
2043
|
+
search?: undefined;
|
|
2044
|
+
searches?: undefined;
|
|
2045
|
+
location?: undefined;
|
|
2046
|
+
geoId?: undefined;
|
|
2047
|
+
postedLimit?: undefined;
|
|
2048
|
+
sortBy?: undefined;
|
|
2049
|
+
workplaceType?: undefined;
|
|
2050
|
+
employmentType?: undefined;
|
|
2051
|
+
experienceLevel?: undefined;
|
|
2052
|
+
easyApply?: undefined;
|
|
2053
|
+
under10Applicants?: undefined;
|
|
2054
|
+
salary?: undefined;
|
|
2055
|
+
pages?: undefined;
|
|
2056
|
+
maxRows?: undefined;
|
|
2057
|
+
artifactFormat?: undefined;
|
|
2058
|
+
};
|
|
2059
|
+
required: string[];
|
|
2060
|
+
additionalProperties: boolean;
|
|
2061
|
+
};
|
|
1959
2062
|
} | {
|
|
1960
2063
|
name: string;
|
|
1961
2064
|
description: string;
|
package/dist/tools/registry.js
CHANGED
|
@@ -2,6 +2,7 @@ import { authToolDefinitions } from "./auth.js";
|
|
|
2
2
|
import { blueprintCommitToolDefinitions } from "./blueprint-commit.js";
|
|
3
3
|
import { bootstrapToolDefinitions } from "./bootstrap.js";
|
|
4
4
|
import { campaignToolDefinitions } from "./campaigns.js";
|
|
5
|
+
import { campaignAbTestToolDefinitions } from "./campaign-ab-test.js";
|
|
5
6
|
import { campaignProcessingToolDefinitions } from "./campaign-processing.js";
|
|
6
7
|
import { cellToolDefinitions } from "./cells.js";
|
|
7
8
|
import { startCliLoginToolDef, waitForCliLoginToolDef } from "./cli-login.js";
|
|
@@ -14,6 +15,7 @@ import { engageMemoryToolDefinitions } from "./engage-memory.js";
|
|
|
14
15
|
import { engageStateToolDefinitions } from "./engage-state.js";
|
|
15
16
|
import { enrichmentToolDefinitions } from "./enrichment.js";
|
|
16
17
|
import { frameworkToolDefinitions } from "./framework.js";
|
|
18
|
+
import { harvestJobToolDefinitions } from "./harvest-jobs.js";
|
|
17
19
|
import { leadToolDefinitions } from "./leads.js";
|
|
18
20
|
import { linkedinToolDefinitions } from "./linkedin.js";
|
|
19
21
|
import { navigationToolDefinitions } from "./navigation.js";
|
|
@@ -30,6 +32,7 @@ import { verifyRowToolDefinitions } from "./verify-row.js";
|
|
|
30
32
|
import { workspaceToolDefinitions } from "./workspaces.js";
|
|
31
33
|
export const allTools = [
|
|
32
34
|
...campaignToolDefinitions,
|
|
35
|
+
...campaignAbTestToolDefinitions,
|
|
33
36
|
...campaignProcessingToolDefinitions,
|
|
34
37
|
...authToolDefinitions,
|
|
35
38
|
startCliLoginToolDef,
|
|
@@ -43,6 +46,7 @@ export const allTools = [
|
|
|
43
46
|
...contentPostToolDefinitions,
|
|
44
47
|
...navigationToolDefinitions,
|
|
45
48
|
...leadToolDefinitions,
|
|
49
|
+
...harvestJobToolDefinitions,
|
|
46
50
|
...enrichmentToolDefinitions,
|
|
47
51
|
...processingToolDefinitions,
|
|
48
52
|
...rubricToolDefinitions,
|
package/package.json
CHANGED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: create-ab-test
|
|
3
|
+
description: Create a Sellable campaign A/B test from a clean source lead list.
|
|
4
|
+
visibility: public
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- mcp__sellable__get_auth_status
|
|
7
|
+
- mcp__sellable__get_active_workspace
|
|
8
|
+
- mcp__sellable__get_campaign
|
|
9
|
+
- mcp__sellable__get_campaign_context
|
|
10
|
+
- mcp__sellable__get_campaign_navigation_state
|
|
11
|
+
- mcp__sellable__get_campaign_messages_preview
|
|
12
|
+
- mcp__sellable__prepare_campaign_ab_test
|
|
13
|
+
- mcp__sellable__load_csv_linkedin_leads
|
|
14
|
+
- mcp__sellable__wait_for_lead_list_ready
|
|
15
|
+
- mcp__sellable__get_table_rows
|
|
16
|
+
- mcp__sellable__get_rows_minimal
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Sellable Create A/B Test
|
|
20
|
+
|
|
21
|
+
Use this workflow when the user asks to create an A/B campaign test, split a
|
|
22
|
+
campaign into variants, duplicate a campaign for copy testing, or compare two
|
|
23
|
+
campaign-message approaches from the same source list.
|
|
24
|
+
|
|
25
|
+
## Opening Contract
|
|
26
|
+
|
|
27
|
+
Start by identifying the source campaign, the one variable being tested, and
|
|
28
|
+
the clean source lead origin. Then prepare the split and stop for review. The
|
|
29
|
+
goal is two review-copy campaigns with clean split source lists, not a launched
|
|
30
|
+
campaign.
|
|
31
|
+
|
|
32
|
+
## Required Flow
|
|
33
|
+
|
|
34
|
+
1. Confirm the source campaign ID or resolve it with `get_campaign`.
|
|
35
|
+
2. Confirm the A/B variable in plain language. Keep variant B as the explicit
|
|
36
|
+
change and leave variant A as the control unless the user names an A change.
|
|
37
|
+
3. Verify the campaign has a clean source lead list. A clean source list is a
|
|
38
|
+
lead-list table, not the generated campaign workflow table.
|
|
39
|
+
4. Call `prepare_campaign_ab_test` with `dryRun: true` first.
|
|
40
|
+
5. Review split counts, duplicate/skipped counts, campaign names, and variant
|
|
41
|
+
brief deltas with the user.
|
|
42
|
+
6. Only after review, call `prepare_campaign_ab_test` without `dryRun` using the
|
|
43
|
+
same `idempotencyKey` if one was returned or supplied.
|
|
44
|
+
7. Return the A and B campaign IDs, split lead-list IDs, counts, and the
|
|
45
|
+
explicit note that both campaigns are `not_started`.
|
|
46
|
+
|
|
47
|
+
## Anti-Patterns
|
|
48
|
+
|
|
49
|
+
- Do not call `export_table_csv` from an enriched/generated campaign workflow
|
|
50
|
+
table as the lead source for A/B splitting.
|
|
51
|
+
- Do not reimport workflow output columns such as `ICP Score`, `Passes Rubric`,
|
|
52
|
+
`Generate Message`, `Message`, `Approved`, scheduling, status, result, or
|
|
53
|
+
error columns.
|
|
54
|
+
- Do not use broad workflow-table selectors to split decorated campaign rows.
|
|
55
|
+
- Do not call `start_campaign`, approve launch, attach senders for launch, or
|
|
56
|
+
trigger live sends in this workflow.
|
|
57
|
+
|
|
58
|
+
## Clean Source Fallback
|
|
59
|
+
|
|
60
|
+
If the source campaign has no clean source lead list, or the source list is
|
|
61
|
+
polluted with workflow/output columns, ask for the original CSV or clean source
|
|
62
|
+
list. Use `load_csv_linkedin_leads`; it strips Sellable workflow columns if a
|
|
63
|
+
contaminated CSV is supplied, then creates a clean lead list. After the clean
|
|
64
|
+
source is confirmed, retry `prepare_campaign_ab_test`.
|
|
65
|
+
|
|
66
|
+
## Output Contract
|
|
67
|
+
|
|
68
|
+
Report:
|
|
69
|
+
|
|
70
|
+
- source campaign ID
|
|
71
|
+
- source lead-list ID
|
|
72
|
+
- split strategy and counts
|
|
73
|
+
- duplicate/skipped lead counts
|
|
74
|
+
- A review campaign ID and split lead-list ID
|
|
75
|
+
- B review campaign ID and split lead-list ID
|
|
76
|
+
- variant difference
|
|
77
|
+
- `launchState: not_started` for both campaigns
|
|
@@ -29,6 +29,8 @@ allowed-tools:
|
|
|
29
29
|
- mcp__sellable__search_prospeo
|
|
30
30
|
- mcp__sellable__search_prospeo_companies
|
|
31
31
|
- mcp__sellable__confirm_prospeo_company_accounts
|
|
32
|
+
- mcp__sellable__search_harvest_jobs
|
|
33
|
+
- mcp__sellable__confirm_harvest_job_companies
|
|
32
34
|
- mcp__sellable__search_signals
|
|
33
35
|
- mcp__sellable__fetch_post_engagers
|
|
34
36
|
- mcp__sellable__enrich_with_prospeo
|
|
@@ -107,6 +109,22 @@ page before importing, call `list_dnc_entries`. Confirm the active workspace
|
|
|
107
109
|
name and ID in the response before any write. This is Sellable's workspace DNC
|
|
108
110
|
list used by DNC Check.
|
|
109
111
|
|
|
112
|
+
## A/B Campaign Requests
|
|
113
|
+
|
|
114
|
+
If the user explicitly asks to create an A/B test, split an existing campaign
|
|
115
|
+
into variants, duplicate a campaign for copy testing, or compare two campaign
|
|
116
|
+
message approaches from the same source list, route them to
|
|
117
|
+
`create-ab-test` instead of improvising inside this create-campaign workflow.
|
|
118
|
+
|
|
119
|
+
Workflow/campaign table exports are decorated outputs for operator review and
|
|
120
|
+
debugging. They are not source lead lists for A/B splitting or campaign
|
|
121
|
+
duplication. Do not use `export_table_csv` from an enriched/generated campaign
|
|
122
|
+
table and then reimport it as leads. If the user only has a contaminated CSV,
|
|
123
|
+
`load_csv_linkedin_leads` strips Sellable workflow columns such as `ICP Score`,
|
|
124
|
+
`Passes Rubric`, `Generate Message`, `Message`, and `Approved`, but the
|
|
125
|
+
preferred A/B path is the dedicated `create-ab-test` workflow using
|
|
126
|
+
`prepare_campaign_ab_test`.
|
|
127
|
+
|
|
110
128
|
## Opening Turn Contract
|
|
111
129
|
|
|
112
130
|
On the first visible response after this skill is invoked, do not narrate
|
|
@@ -227,6 +245,14 @@ are likely. Sales Nav is useful for recent LinkedIn activity, role/title
|
|
|
227
245
|
precision, and referral paths, but it does not provide hiring-by-role filters;
|
|
228
246
|
say that distinction plainly in the source-plan gate.
|
|
229
247
|
|
|
248
|
+
When the brief asks for current LinkedIn job-post intent, such as companies
|
|
249
|
+
hiring Power BI developers this month, use Harvest jobs as the account source:
|
|
250
|
+
`search_harvest_jobs -> confirm_harvest_job_companies -> search_prospeo`.
|
|
251
|
+
First write and review the Harvest job artifact. Then confirm selected Harvest
|
|
252
|
+
job IDs into a `domainFilterId`; Prospeo remains the people-search provider.
|
|
253
|
+
Do not paste LinkedIn company URLs as domains. Do not fetch full job details for
|
|
254
|
+
every search row by default; selected batches only.
|
|
255
|
+
|
|
230
256
|
For company lookalikes, best-customer lookalikes, "companies like X",
|
|
231
257
|
lookalike accounts, companies that use AI, companies with API/SSO/Chrome
|
|
232
258
|
extension, news/award/integration/key-customer filters, or account discovery
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
"requiredTools": [
|
|
8
8
|
"update_campaign",
|
|
9
9
|
"get_provider_prompt",
|
|
10
|
+
"search_harvest_jobs",
|
|
11
|
+
"confirm_harvest_job_companies",
|
|
10
12
|
"search_prospeo_companies",
|
|
11
13
|
"confirm_prospeo_company_accounts",
|
|
12
14
|
"search_prospeo",
|
|
@@ -24,13 +26,14 @@
|
|
|
24
26
|
"useWhen": [
|
|
25
27
|
"You want Prospeo filters or domain-based search",
|
|
26
28
|
"You need company lookalike account discovery before finding people",
|
|
29
|
+
"You need current LinkedIn job-post evidence before finding hiring stakeholders",
|
|
27
30
|
"You want companies like X, target-domain, best-customer/top-customer, or job-search employer lookalikes, or accounts using AI/API/SSO/Chrome extensions",
|
|
28
31
|
"You need companies hiring for specific roles using job-posting filters",
|
|
29
32
|
"You need high deliverability from Prospeo"
|
|
30
33
|
],
|
|
31
34
|
"avoidWhen": ["You need LinkedIn activity filters"],
|
|
32
|
-
"reason": "Strong for hiring-led search, company/account lookalikes, Prospeo-specific filters, verified contacts, and domain lists.",
|
|
33
|
-
"prose": "Since you're targeting **{icp}**, I'd recommend **Prospeo**.\n\nHere's why:\n- Prospeo can discover lookalike accounts first, then turn approved accounts into a domainFilterId for people search\n- Prospeo can filter for companies hiring specific roles with job-posting filters\n- We can pair those company signals with buyer/referrer titles and verified-contact coverage\n\nFor lookalike accounts, I will show an account sample first; those account rows are not people leads yet. After approval, I will use the companySearchToken to confirm the accounts, then search people at the returned domainFilterId. For outbound lookalikes, I will use target/account/customer domains or verified past-customer accounts, not the sender's company. For job-search/application lookalikes, I can use current or past employers as existing-company seeds.\n\nShould I search Prospeo for {icp}?"
|
|
35
|
+
"reason": "Strong for hiring-led search, current LinkedIn job-post account sourcing, company/account lookalikes, Prospeo-specific filters, verified contacts, and domain lists.",
|
|
36
|
+
"prose": "Since you're targeting **{icp}**, I'd recommend **Prospeo**.\n\nHere's why:\n- Prospeo can discover lookalike accounts first, then turn approved accounts into a domainFilterId for people search\n- Harvest job search can source companies from current LinkedIn job posts, then confirm selected jobs into a domainFilterId for Prospeo people search\n- Prospeo can filter for companies hiring specific roles with job-posting filters\n- We can pair those company signals with buyer/referrer titles and verified-contact coverage\n\nFor current LinkedIn job-post evidence, I will use search_harvest_jobs -> confirm_harvest_job_companies -> search_prospeo. I will not paste LinkedIn company URLs as domains, and I will only fetch job details for selected batches. For lookalike accounts, I will show an account sample first; those account rows are not people leads yet. After approval, I will use the companySearchToken to confirm the accounts, then search people at the returned domainFilterId. For outbound lookalikes, I will use target/account/customer domains or verified past-customer accounts, not the sender's company. For job-search/application lookalikes, I can use current or past employers as existing-company seeds.\n\nShould I search Prospeo for {icp}?"
|
|
34
37
|
},
|
|
35
38
|
"askOption": {
|
|
36
39
|
"label": "Prospeo",
|
|
@@ -761,6 +761,15 @@ help...` or `built for [buyer] to...`. Do not overuse generic solved-state
|
|
|
761
761
|
bridges like `there's a way to...`; they read informercial when they imply
|
|
762
762
|
the buyer's problem is now solved before the product or artifact has earned
|
|
763
763
|
that claim.
|
|
764
|
+
- run a contraction naturalness pass on the buyer-facing copy before selecting
|
|
765
|
+
the winner. Use common contractions when they make the message sound like a
|
|
766
|
+
human LinkedIn note: `it is` -> `it's`, `does not` -> `doesn't`, `do not` ->
|
|
767
|
+
`don't`, `cannot` -> `can't`, `we are` -> `we're`, `I am` -> `I'm`, and
|
|
768
|
+
`you are` -> `you're`. Keep the uncontracted form only when emphasis,
|
|
769
|
+
grammar, token boundaries, legal/technical clarity, or a deliberate formal
|
|
770
|
+
voice requires it. Do not create awkward noun contractions like
|
|
771
|
+
`outbound's becoming`. If selected copy contains stiff helper-verb phrasing
|
|
772
|
+
such as `It is knowing...`, rewrite it before approval.
|
|
764
773
|
- do not let the first substantive line become a generic problem-solved
|
|
765
774
|
promise. Openers shaped like `there's a way to stop/fix/solve [problem]`
|
|
766
775
|
are BLOCKED when they sound like an ad, imply the problem is already
|
|
@@ -2633,6 +2642,7 @@ hiring for`
|
|
|
2633
2642
|
- Best PS / no-PS decision: Candidate [A|B|C] — reason
|
|
2634
2643
|
- Element edits made by finalizer: ...
|
|
2635
2644
|
- Parallel action formatting: bullets used | paragraphs kept | not applicable — reason
|
|
2645
|
+
- Contraction naturalness: PASS | BLOCKED — reason
|
|
2636
2646
|
- Style consistency check: PASS | BLOCKED — reason
|
|
2637
2647
|
- Assembly note: clean combination or one candidate swept
|
|
2638
2648
|
|
|
@@ -9,10 +9,31 @@ Prospeo supports search + import in the campaign builder flow.
|
|
|
9
9
|
## Provider Decision Tree
|
|
10
10
|
|
|
11
11
|
- Known account list or CSV: use `load_csv_domains` or `save_domain_filters`, then `search_prospeo`.
|
|
12
|
+
- Current LinkedIn job-post intent: use `search_harvest_jobs`, review the job artifact, then use `confirm_harvest_job_companies` with selected Harvest job IDs to create a `domainFilterId`; only then call `search_prospeo` for hiring stakeholders at those companies. Harvest jobs are the account source, not a people-search replacement.
|
|
12
13
|
- Company/account lookalikes: use `search_prospeo_companies`, review the account sample, then use `confirm_prospeo_company_accounts` with the returned `companySearchToken` to create a `domainFilterId`; only then call `search_prospeo` for people at those accounts. Account rows are not people leads yet.
|
|
13
14
|
- Person search with known filters: use `search_prospeo` directly.
|
|
14
15
|
- LinkedIn activity, content-source, or post-engagement intent: stay on Signal Discovery or Sales Nav, not Prospeo.
|
|
15
16
|
|
|
17
|
+
Current LinkedIn job-post account sourcing must follow:
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
search_harvest_jobs -> confirm_harvest_job_companies -> search_prospeo
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Use `search_harvest_jobs` when the user's account-source intent is current
|
|
24
|
+
LinkedIn job posts, for example "companies hiring Power BI developers in the US
|
|
25
|
+
this month." The search tool writes review artifacts and returns a token or
|
|
26
|
+
`mcp-harvest-job-search-token:*` reference. After reviewing selected jobs, call
|
|
27
|
+
`confirm_harvest_job_companies` with selected Harvest job IDs only. It resolves
|
|
28
|
+
real company website domains from selected job details and bounded
|
|
29
|
+
`/linkedin/company` fallback, then returns a `domainFilterId` for
|
|
30
|
+
`search_prospeo`.
|
|
31
|
+
|
|
32
|
+
Do not paste LinkedIn company URLs as domains. Do not detail-fetch every job row
|
|
33
|
+
by default; fetch details only for selected batches during confirmation. Use
|
|
34
|
+
Prospeo directly when the user wants broader volume, company attributes,
|
|
35
|
+
lookalikes, or people search without needing current LinkedIn job evidence.
|
|
36
|
+
|
|
16
37
|
Company/account lookalikes must follow:
|
|
17
38
|
|
|
18
39
|
```text
|