@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,140 @@
|
|
|
1
|
+
type WorkspaceSummary = {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
slug: string;
|
|
5
|
+
role: string;
|
|
6
|
+
isDefault: boolean;
|
|
7
|
+
createdAt: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const workspaceToolDefinitions: ({
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
inputSchema: {
|
|
13
|
+
type: string;
|
|
14
|
+
properties: {
|
|
15
|
+
workspaceId?: undefined;
|
|
16
|
+
userConfirmed?: undefined;
|
|
17
|
+
name?: undefined;
|
|
18
|
+
email?: undefined;
|
|
19
|
+
role?: undefined;
|
|
20
|
+
redirectTo?: undefined;
|
|
21
|
+
campaignId?: undefined;
|
|
22
|
+
};
|
|
23
|
+
required: never[];
|
|
24
|
+
additionalProperties: boolean;
|
|
25
|
+
};
|
|
26
|
+
} | {
|
|
27
|
+
name: string;
|
|
28
|
+
description: string;
|
|
29
|
+
inputSchema: {
|
|
30
|
+
type: string;
|
|
31
|
+
properties: {
|
|
32
|
+
workspaceId: {
|
|
33
|
+
type: string;
|
|
34
|
+
};
|
|
35
|
+
userConfirmed: {
|
|
36
|
+
type: string;
|
|
37
|
+
description: string;
|
|
38
|
+
};
|
|
39
|
+
name?: undefined;
|
|
40
|
+
email?: undefined;
|
|
41
|
+
role?: undefined;
|
|
42
|
+
redirectTo?: undefined;
|
|
43
|
+
campaignId?: undefined;
|
|
44
|
+
};
|
|
45
|
+
required: string[];
|
|
46
|
+
additionalProperties: boolean;
|
|
47
|
+
};
|
|
48
|
+
} | {
|
|
49
|
+
name: string;
|
|
50
|
+
description: string;
|
|
51
|
+
inputSchema: {
|
|
52
|
+
type: string;
|
|
53
|
+
properties: {
|
|
54
|
+
name: {
|
|
55
|
+
type: string;
|
|
56
|
+
};
|
|
57
|
+
workspaceId?: undefined;
|
|
58
|
+
userConfirmed?: undefined;
|
|
59
|
+
email?: undefined;
|
|
60
|
+
role?: undefined;
|
|
61
|
+
redirectTo?: undefined;
|
|
62
|
+
campaignId?: undefined;
|
|
63
|
+
};
|
|
64
|
+
required: string[];
|
|
65
|
+
additionalProperties: boolean;
|
|
66
|
+
};
|
|
67
|
+
} | {
|
|
68
|
+
name: string;
|
|
69
|
+
description: string;
|
|
70
|
+
inputSchema: {
|
|
71
|
+
type: string;
|
|
72
|
+
properties: {
|
|
73
|
+
email: {
|
|
74
|
+
type: string;
|
|
75
|
+
};
|
|
76
|
+
role: {
|
|
77
|
+
type: string;
|
|
78
|
+
enum: string[];
|
|
79
|
+
};
|
|
80
|
+
redirectTo: {
|
|
81
|
+
type: string;
|
|
82
|
+
};
|
|
83
|
+
campaignId: {
|
|
84
|
+
type: string;
|
|
85
|
+
};
|
|
86
|
+
workspaceId?: undefined;
|
|
87
|
+
userConfirmed?: undefined;
|
|
88
|
+
name?: undefined;
|
|
89
|
+
};
|
|
90
|
+
required: string[];
|
|
91
|
+
additionalProperties: boolean;
|
|
92
|
+
};
|
|
93
|
+
})[];
|
|
94
|
+
export declare function listWorkspaces(): Promise<{
|
|
95
|
+
workspaces: WorkspaceSummary[];
|
|
96
|
+
}>;
|
|
97
|
+
export declare function getActiveWorkspace(): {
|
|
98
|
+
activeWorkspaceId: string | null;
|
|
99
|
+
activeWorkspaceName: string | null;
|
|
100
|
+
};
|
|
101
|
+
export declare function setActiveWorkspace(workspaceId: string, userConfirmed?: boolean): Promise<{
|
|
102
|
+
ok: boolean;
|
|
103
|
+
error: string;
|
|
104
|
+
requiresConfirmation?: undefined;
|
|
105
|
+
activeWorkspaceId?: undefined;
|
|
106
|
+
activeWorkspaceName?: undefined;
|
|
107
|
+
requestedWorkspaceId?: undefined;
|
|
108
|
+
requestedWorkspaceName?: undefined;
|
|
109
|
+
} | {
|
|
110
|
+
ok: boolean;
|
|
111
|
+
requiresConfirmation: boolean;
|
|
112
|
+
activeWorkspaceId: string;
|
|
113
|
+
activeWorkspaceName: string | null;
|
|
114
|
+
requestedWorkspaceId: string;
|
|
115
|
+
requestedWorkspaceName: string;
|
|
116
|
+
error: string;
|
|
117
|
+
} | {
|
|
118
|
+
ok: boolean;
|
|
119
|
+
activeWorkspaceId: string;
|
|
120
|
+
activeWorkspaceName: string;
|
|
121
|
+
error?: undefined;
|
|
122
|
+
requiresConfirmation?: undefined;
|
|
123
|
+
requestedWorkspaceId?: undefined;
|
|
124
|
+
requestedWorkspaceName?: undefined;
|
|
125
|
+
}>;
|
|
126
|
+
export declare function createWorkspace(name: string): Promise<{
|
|
127
|
+
workspace: {
|
|
128
|
+
id: string;
|
|
129
|
+
name: string;
|
|
130
|
+
slug: string;
|
|
131
|
+
};
|
|
132
|
+
activeWorkspaceId: string;
|
|
133
|
+
}>;
|
|
134
|
+
export declare function addTeammate(input: {
|
|
135
|
+
email: string;
|
|
136
|
+
role?: "ADMIN" | "MEMBER";
|
|
137
|
+
redirectTo?: string;
|
|
138
|
+
campaignId?: string;
|
|
139
|
+
}): Promise<unknown>;
|
|
140
|
+
export {};
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { getApi, resetApi } from "../api.js";
|
|
2
|
+
import { getConfig, updateActiveWorkspace } from "../auth.js";
|
|
3
|
+
export const workspaceToolDefinitions = [
|
|
4
|
+
{
|
|
5
|
+
name: "list_workspaces",
|
|
6
|
+
description: "List accessible workspaces.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {},
|
|
10
|
+
required: [],
|
|
11
|
+
additionalProperties: false,
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: "get_active_workspace",
|
|
16
|
+
description: "Show the active workspace selection.",
|
|
17
|
+
inputSchema: {
|
|
18
|
+
type: "object",
|
|
19
|
+
properties: {},
|
|
20
|
+
required: [],
|
|
21
|
+
additionalProperties: false,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: "set_active_workspace",
|
|
26
|
+
description: "Set active workspace by ID. Only call this when the user explicitly asks to switch workspace.",
|
|
27
|
+
inputSchema: {
|
|
28
|
+
type: "object",
|
|
29
|
+
properties: {
|
|
30
|
+
workspaceId: { type: "string" },
|
|
31
|
+
userConfirmed: {
|
|
32
|
+
type: "boolean",
|
|
33
|
+
description: "Must be true when switching away from the current workspace.",
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
required: ["workspaceId"],
|
|
37
|
+
additionalProperties: false,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "create_workspace",
|
|
42
|
+
description: "Create a new workspace.",
|
|
43
|
+
inputSchema: {
|
|
44
|
+
type: "object",
|
|
45
|
+
properties: {
|
|
46
|
+
name: { type: "string" },
|
|
47
|
+
},
|
|
48
|
+
required: ["name"],
|
|
49
|
+
additionalProperties: false,
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: "add_teammate",
|
|
54
|
+
description: "Invite a teammate to the active workspace.",
|
|
55
|
+
inputSchema: {
|
|
56
|
+
type: "object",
|
|
57
|
+
properties: {
|
|
58
|
+
email: { type: "string" },
|
|
59
|
+
role: { type: "string", enum: ["ADMIN", "MEMBER"] },
|
|
60
|
+
redirectTo: { type: "string" },
|
|
61
|
+
campaignId: { type: "string" },
|
|
62
|
+
},
|
|
63
|
+
required: ["email"],
|
|
64
|
+
additionalProperties: false,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
export async function listWorkspaces() {
|
|
69
|
+
const api = getApi();
|
|
70
|
+
const { workspaces } = await api.get("/api/v3/workspaces");
|
|
71
|
+
return { workspaces };
|
|
72
|
+
}
|
|
73
|
+
export function getActiveWorkspace() {
|
|
74
|
+
const config = getConfig();
|
|
75
|
+
return {
|
|
76
|
+
activeWorkspaceId: config.activeWorkspaceId || config.workspaceId || null,
|
|
77
|
+
activeWorkspaceName: config.activeWorkspaceName || null,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export async function setActiveWorkspace(workspaceId, userConfirmed) {
|
|
81
|
+
const api = getApi();
|
|
82
|
+
const { workspaces } = await api.get("/api/v3/workspaces");
|
|
83
|
+
const match = workspaces.find((ws) => ws.id === workspaceId);
|
|
84
|
+
if (!match) {
|
|
85
|
+
return {
|
|
86
|
+
ok: false,
|
|
87
|
+
error: `Workspace ${workspaceId} not found in access list.`,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
const current = getActiveWorkspace();
|
|
91
|
+
if (current.activeWorkspaceId &&
|
|
92
|
+
current.activeWorkspaceId !== match.id &&
|
|
93
|
+
userConfirmed !== true) {
|
|
94
|
+
return {
|
|
95
|
+
ok: false,
|
|
96
|
+
requiresConfirmation: true,
|
|
97
|
+
activeWorkspaceId: current.activeWorkspaceId,
|
|
98
|
+
activeWorkspaceName: current.activeWorkspaceName,
|
|
99
|
+
requestedWorkspaceId: match.id,
|
|
100
|
+
requestedWorkspaceName: match.name,
|
|
101
|
+
error: "Workspace switch blocked until explicit confirmation. Re-run set_active_workspace with userConfirmed=true only if the user asked to switch.",
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
updateActiveWorkspace({
|
|
105
|
+
workspaceId: match.id,
|
|
106
|
+
workspaceName: match.name,
|
|
107
|
+
});
|
|
108
|
+
resetApi();
|
|
109
|
+
return {
|
|
110
|
+
ok: true,
|
|
111
|
+
activeWorkspaceId: match.id,
|
|
112
|
+
activeWorkspaceName: match.name,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
export async function createWorkspace(name) {
|
|
116
|
+
const api = getApi();
|
|
117
|
+
const { workspace } = await api.post("/api/v3/workspaces", { name });
|
|
118
|
+
updateActiveWorkspace({
|
|
119
|
+
workspaceId: workspace.id,
|
|
120
|
+
workspaceName: workspace.name,
|
|
121
|
+
});
|
|
122
|
+
resetApi();
|
|
123
|
+
return {
|
|
124
|
+
workspace,
|
|
125
|
+
activeWorkspaceId: workspace.id,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
export async function addTeammate(input) {
|
|
129
|
+
const config = getConfig();
|
|
130
|
+
const workspaceId = config.activeWorkspaceId || config.workspaceId;
|
|
131
|
+
if (!workspaceId) {
|
|
132
|
+
return {
|
|
133
|
+
ok: false,
|
|
134
|
+
error: "No active workspace. Run list_workspaces then set_active_workspace.",
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
const api = getApi();
|
|
138
|
+
return api.post("/api/v3/workspaces/invites", input);
|
|
139
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function resolveWorkspaceRoot(startDir: string): string;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { existsSync } from "fs";
|
|
2
|
+
import { dirname, resolve } from "path";
|
|
3
|
+
const MARKERS = [
|
|
4
|
+
{
|
|
5
|
+
markerPath: "mcp/sellable/skills/create-campaign/core/policy.md",
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
markerPath: "web/mcp/sellable/skills/create-campaign/core/policy.md",
|
|
9
|
+
rootSuffix: "web",
|
|
10
|
+
},
|
|
11
|
+
];
|
|
12
|
+
function findWorkspaceRoot(startDir) {
|
|
13
|
+
let current = startDir;
|
|
14
|
+
for (let i = 0; i < 10; i += 1) {
|
|
15
|
+
for (const marker of MARKERS) {
|
|
16
|
+
const candidate = resolve(current, marker.markerPath);
|
|
17
|
+
if (existsSync(candidate)) {
|
|
18
|
+
return marker.rootSuffix
|
|
19
|
+
? resolve(current, marker.rootSuffix)
|
|
20
|
+
: current;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const next = dirname(current);
|
|
24
|
+
if (next === current)
|
|
25
|
+
break;
|
|
26
|
+
current = next;
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
export function resolveWorkspaceRoot(startDir) {
|
|
31
|
+
const candidates = [startDir, process.cwd(), process.env.PWD].filter(Boolean);
|
|
32
|
+
for (const candidate of candidates) {
|
|
33
|
+
const resolved = findWorkspaceRoot(candidate);
|
|
34
|
+
if (resolved) {
|
|
35
|
+
return resolved;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return process.cwd();
|
|
39
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sellable/mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Sellable MCP server for Claude Code and Codex campaign workflows",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"sellable-mcp": "dist/index.js",
|
|
9
|
+
"sellable-mcp-dev": "dist/index-dev.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"start:dev": "node dist/index-dev.js",
|
|
15
|
+
"dev": "ts-node src/index.ts"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"mcp",
|
|
19
|
+
"claude-code",
|
|
20
|
+
"codex",
|
|
21
|
+
"sellable",
|
|
22
|
+
"linkedin",
|
|
23
|
+
"outreach"
|
|
24
|
+
],
|
|
25
|
+
"author": "Sellable",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
29
|
+
"csv-parse": "^5.6.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^20.0.0",
|
|
33
|
+
"ts-node": "^10.9.0",
|
|
34
|
+
"typescript": "^5.0.0"
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"dist",
|
|
38
|
+
"skills",
|
|
39
|
+
".claude-plugin",
|
|
40
|
+
".mcp.json",
|
|
41
|
+
"README.md"
|
|
42
|
+
],
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: building-gtm-tables
|
|
3
|
+
description: Turn a GTM idea into a fully configured, verified workflow table. Use this skill whenever the user asks to "build a table that..." / "set up an enrichment + scoring pipeline" / "add columns that run end-to-end against my rows." Blueprints the whole table in memory, validates composition, commits atomically in topological order, then runs single-row verify + a user-approved 2-5 row batch before declaring done. Do NOT use this skill for pure messaging or for editing an already-committed table one column at a time.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Building GTM Tables
|
|
7
|
+
|
|
8
|
+
You are the building-gtm-tables orchestrator. Your job is to turn a user's GTM
|
|
9
|
+
table idea into a validated workflow-table blueprint, commit that blueprint
|
|
10
|
+
atomically, and verify real rows before calling the work done.
|
|
11
|
+
|
|
12
|
+
## When to fire
|
|
13
|
+
|
|
14
|
+
Use this skill when the user asks for a net-new or substantially composed GTM
|
|
15
|
+
workflow table, for example:
|
|
16
|
+
|
|
17
|
+
- "Build a table that enriches LinkedIn profiles and scores each prospect."
|
|
18
|
+
- "Set up enrichment, ICP scoring, and an invite action for these rows."
|
|
19
|
+
- "Add columns that run end-to-end against my lead list."
|
|
20
|
+
- "Create a workflow table pipeline for pulling prospect context and deciding next action."
|
|
21
|
+
- "Turn this ICP idea into an automated table."
|
|
22
|
+
|
|
23
|
+
Do not use this skill for pure campaign messaging. Use create-campaign-v2 for
|
|
24
|
+
campaign creation and message approval flows. Do not use it for a simple
|
|
25
|
+
one-column edit after a table is already committed; call `sellable:add_column`
|
|
26
|
+
directly for that narrow case.
|
|
27
|
+
|
|
28
|
+
## Reasoning checklist
|
|
29
|
+
|
|
30
|
+
Before writing any blueprint JSON:
|
|
31
|
+
|
|
32
|
+
- Identify the row's inputs: LinkedIn URL, email, company domain, existing JSON,
|
|
33
|
+
or another stable row field.
|
|
34
|
+
- Pick the enrichment recipe. The usual recipe is a `http_request` column named
|
|
35
|
+
"Enrich Prospect" with endpoint `/api/v4/enrich-prospect`.
|
|
36
|
+
- Pick the scoring criteria. If AI ICP scoring is needed, use
|
|
37
|
+
`score_icp_mcp` with a natural-language rubric the user can inspect. This
|
|
38
|
+
is the MCP-safe AI scorer for new blueprints.
|
|
39
|
+
- Pick action or generation columns: LinkedIn actions, AI Column, or Generate
|
|
40
|
+
Message.
|
|
41
|
+
- Wire dependencies explicitly. Every downstream `inputMapping` key references
|
|
42
|
+
the producer column by id.
|
|
43
|
+
- Read `references/brief-to-blueprint.md` for the full decomposition recipe and
|
|
44
|
+
worked examples.
|
|
45
|
+
|
|
46
|
+
## Phase gates
|
|
47
|
+
|
|
48
|
+
Gate 1: BLUEPRINT.
|
|
49
|
+
|
|
50
|
+
Prerequisites: user intent is clear enough to identify row inputs, enrichment,
|
|
51
|
+
scoring, action/generation needs, and table id if updating an existing table.
|
|
52
|
+
|
|
53
|
+
What the agent does: author a complete in-memory Blueprint that conforms to
|
|
54
|
+
`core/blueprint-schema.json`; pick column types from
|
|
55
|
+
`references/column-type-catalog.md`; run the blueprint validator through
|
|
56
|
+
`sellable:commit_blueprint` dry-run behavior when available before mutation.
|
|
57
|
+
|
|
58
|
+
Exit criterion: the blueprint validator returns `ok:true`. Do not start COMMIT
|
|
59
|
+
until the blueprint validator returns `ok:true`.
|
|
60
|
+
|
|
61
|
+
Gate 2: COMMIT.
|
|
62
|
+
|
|
63
|
+
Prerequisites: Gate 1 passed and any user-visible tradeoff has been resolved.
|
|
64
|
+
|
|
65
|
+
What the agent does: call exactly one committing tool for the full table shape:
|
|
66
|
+
`sellable:commit_blueprint`.
|
|
67
|
+
|
|
68
|
+
Exit criterion: the committed table contains the intended columns, dependencies,
|
|
69
|
+
and orchestrator-queued cells in topological order.
|
|
70
|
+
|
|
71
|
+
Gate 3: VERIFY.
|
|
72
|
+
|
|
73
|
+
Prerequisites: Gate 2 succeeded and at least one representative row id is known.
|
|
74
|
+
|
|
75
|
+
What the agent does: run `sellable:verify_table_row` on one row, fix forward
|
|
76
|
+
until green, then run the required batch confirmation.
|
|
77
|
+
|
|
78
|
+
Exit criterion: do not declare DONE until BOTH single-row verify AND a
|
|
79
|
+
user-approved 2-5 row batch verify report `ok:true`; see Phase gate 3b below.
|
|
80
|
+
Single-row green alone is not sufficient.
|
|
81
|
+
|
|
82
|
+
## Blueprint phase (in-memory)
|
|
83
|
+
|
|
84
|
+
Author the Blueprint before touching live cells. The Blueprint object has
|
|
85
|
+
`tableId`, `columns`, and `edges`; each column has `id`, `type`, `name`,
|
|
86
|
+
`config`, optional `inputMapping`, optional `runCondition`, and optional
|
|
87
|
+
`deferExecutor`.
|
|
88
|
+
|
|
89
|
+
Use `core/blueprint-schema.json` as the structured-output shape. Use
|
|
90
|
+
`references/column-type-catalog.md` to select current active column types and
|
|
91
|
+
exact display names. Use `references/brief-to-blueprint.md` to decompose the
|
|
92
|
+
brief into inputs, enrichment, scoring, action/generation, and wiring. Use
|
|
93
|
+
`references/failure-taxonomy.md` for validator checks framed as the error the
|
|
94
|
+
LLM likely made and the fix-forward action.
|
|
95
|
+
|
|
96
|
+
Blueprint rules:
|
|
97
|
+
|
|
98
|
+
- Use stable, readable column ids such as `linkedin_url`, `enrich_prospect`, and
|
|
99
|
+
`score_icp_mcp`.
|
|
100
|
+
- Use registry type keys exactly, not display names.
|
|
101
|
+
- Treat "Enrich Prospect" as a `http_request` preset, not its own type.
|
|
102
|
+
- Use `score_icp_mcp` for new AI ICP scoring. Do not use legacy
|
|
103
|
+
`score_icp` or the old `score_icp_rubric` alias; they are reserved for older
|
|
104
|
+
saved tables and different config contracts.
|
|
105
|
+
- Treat Enrich Prospect as the baseline Sellable producer for prospect context.
|
|
106
|
+
If a blueprint includes `score_icp_mcp` or `generate_message`, it should
|
|
107
|
+
also include `http_request` named "Enrich Prospect" unless the user explicitly
|
|
108
|
+
says the table already has an enriched prospect id column.
|
|
109
|
+
- Put every dependency in `inputMapping`; do not rely on implicit column-name
|
|
110
|
+
guessing.
|
|
111
|
+
- When a downstream column needs an enriched prospect, wire it to the Enrich
|
|
112
|
+
Prospect root `id` field, not to the whole HTTP result:
|
|
113
|
+
`score_icp_mcp.inputMapping.enrichedProspectId -> enrich_prospect` and
|
|
114
|
+
`generate_message.inputMapping.enrichedProspectId -> enrich_prospect`.
|
|
115
|
+
The commit tool materializes that blueprint reference as
|
|
116
|
+
`{{<actual Enrich Prospect column id>.id}}`.
|
|
117
|
+
- Keep `edges` aligned with `inputMapping` so humans can inspect the graph.
|
|
118
|
+
- Prefer topological order in the `columns` array even though the commit tool
|
|
119
|
+
validates and commits in dependency order.
|
|
120
|
+
|
|
121
|
+
## Commit phase
|
|
122
|
+
|
|
123
|
+
Use exactly one tool for the initial commit:
|
|
124
|
+
|
|
125
|
+
`sellable:commit_blueprint({ blueprint })`
|
|
126
|
+
|
|
127
|
+
Retry up to 3 times for recoverable errors:
|
|
128
|
+
|
|
129
|
+
- `phantom_type`: replace the invalid type with the active registry key.
|
|
130
|
+
- `required_field`: fill the missing config or input mapping.
|
|
131
|
+
- `wrong_order`: move the producer earlier and fix the graph.
|
|
132
|
+
- `missing_producer`: add the producer column or correct the referenced id.
|
|
133
|
+
- `concurrent_commit`: wait briefly, reload table context if needed, and retry.
|
|
134
|
+
|
|
135
|
+
Escalate after 3 retries with the last validator response and the smallest
|
|
136
|
+
concrete question needed to unblock the user.
|
|
137
|
+
|
|
138
|
+
## Verify phase
|
|
139
|
+
|
|
140
|
+
Read `references/verify-loop.md` before declaring done.
|
|
141
|
+
|
|
142
|
+
### Phase gate 3a: Single-row verify
|
|
143
|
+
|
|
144
|
+
Run:
|
|
145
|
+
|
|
146
|
+
```json
|
|
147
|
+
sellable:verify_table_row({ "rowId": "ROW_ID", "skipColumnIds": [], "forceRerun": true })
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Expect `ok:true` with per-column statuses among `success`, `skipped`,
|
|
151
|
+
`deferred_to_sweeper`, and `condition_not_met`. Any `error` means fix forward:
|
|
152
|
+
adjust blueprint-derived column config with the supported table tooling, rerun
|
|
153
|
+
verify, and escalate after 3 attempts on the same column.
|
|
154
|
+
|
|
155
|
+
### Phase gate 3b: Batch confirmation (2-5 rows user-approved)
|
|
156
|
+
|
|
157
|
+
After single-row green, ask the user to pick 2-5 additional rows. Re-run
|
|
158
|
+
`sellable:verify_table_row` for each selected row. Declare done ONLY if all rows
|
|
159
|
+
return `ok:true`. Single-row green alone is NOT sufficient to declare the skill
|
|
160
|
+
done.
|
|
161
|
+
|
|
162
|
+
### Skipped columns policy (option d)
|
|
163
|
+
|
|
164
|
+
Wait and long-timer columns are skipped via caller-supplied `skipColumnIds`.
|
|
165
|
+
This skill does not override `runCondition` at runtime. Runtime condition
|
|
166
|
+
swapping is brittle because it requires a restore step and can hide the actual
|
|
167
|
+
production behavior.
|
|
168
|
+
|
|
169
|
+
## Tool inventory
|
|
170
|
+
|
|
171
|
+
- `sellable:commit_blueprint`: validate and atomically commit the full table
|
|
172
|
+
blueprint in dependency order.
|
|
173
|
+
- `sellable:add_column`: add one column to an already-committed table when the
|
|
174
|
+
user explicitly asks for a narrow column edit outside this full-table skill.
|
|
175
|
+
- `sellable:verify_table_row`: execute or inspect a row through the committed
|
|
176
|
+
table graph and return per-column verification statuses.
|
|
177
|
+
|
|
178
|
+
## HARD INVARIANTS - forbidden direct tool calls
|
|
179
|
+
|
|
180
|
+
HARD INVARIANT: Never call `sellable:queue_cells` directly. Use
|
|
181
|
+
`sellable:commit_blueprint` to create columns, which queues their cells
|
|
182
|
+
automatically through the orchestrator, and `sellable:verify_table_row` to
|
|
183
|
+
trigger verification runs. Direct queue_cells calls bypass
|
|
184
|
+
blueprint-then-commit discipline and produce the premature-queueing bug class
|
|
185
|
+
documented in `references/failure-taxonomy.md`.
|
|
186
|
+
|
|
187
|
+
HARD INVARIANT: Never call `sellable:update_cell` directly. Cell values are
|
|
188
|
+
populated by column execution, not user-authored. Direct update_cell calls hide
|
|
189
|
+
broken wiring that `sellable:verify_table_row` would catch.
|
|
190
|
+
|
|
191
|
+
HARD INVARIANT: Never invent a tool name such as configure_column or
|
|
192
|
+
update_column_run_condition. The only 3 new tools this skill commands are
|
|
193
|
+
commit_blueprint, add_column, and verify_table_row. All other column reasoning
|
|
194
|
+
lives inside `sellable:commit_blueprint`'s blueprint argument.
|
|
195
|
+
|
|
196
|
+
## Failure taxonomy
|
|
197
|
+
|
|
198
|
+
Read `references/failure-taxonomy.md` when validation fails, when a tool call
|
|
199
|
+
looks tempting before the blueprint is complete, or when the table verifies on
|
|
200
|
+
one row but not a batch.
|
|
201
|
+
|
|
202
|
+
## Progressive disclosure index
|
|
203
|
+
|
|
204
|
+
- `references/column-type-catalog.md`: read when choosing type keys, exact
|
|
205
|
+
display names, input mappings, output expectations, and when not to use each
|
|
206
|
+
column.
|
|
207
|
+
- `references/brief-to-blueprint.md`: read when translating the user's brief
|
|
208
|
+
into the in-memory blueprint reasoning trace.
|
|
209
|
+
- `references/verify-loop.md`: read before single-row verify, batch
|
|
210
|
+
confirmation, skipped-column handling, or declaring done.
|
|
211
|
+
- `references/common-blueprints.md`: read for complete JSON examples you can
|
|
212
|
+
adapt.
|
|
213
|
+
- `references/uat-seed-prompts.md`: read when running live UAT against a real
|
|
214
|
+
table or rehearsing seeded validator faults.
|
|
215
|
+
- `references/failure-taxonomy.md`: read when the validator reports an error or
|
|
216
|
+
when the agent is tempted to call direct cell tools.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Auto-execute hints for building-gtm-tables.
|
|
2
|
+
#
|
|
3
|
+
# This file is advisory. The skill prompt owns phase-gate behavior and the MCP
|
|
4
|
+
# tools own validation, commit, and row verification.
|
|
5
|
+
|
|
6
|
+
version: 1
|
|
7
|
+
|
|
8
|
+
blueprint:
|
|
9
|
+
dryRunFirst: true
|
|
10
|
+
|
|
11
|
+
commit:
|
|
12
|
+
maxRetries: 3
|
|
13
|
+
|
|
14
|
+
verify:
|
|
15
|
+
maxSingleRowAttempts: 3
|
|
16
|
+
userBatchSize: "2-5"
|
|
17
|
+
|
|
18
|
+
logging:
|
|
19
|
+
logEveryThresholdTrip: true
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "Sellable GTM Table Blueprint",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"required": ["columns", "edges"],
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"properties": {
|
|
8
|
+
"tableId": {
|
|
9
|
+
"type": "string"
|
|
10
|
+
},
|
|
11
|
+
"columns": {
|
|
12
|
+
"type": "array",
|
|
13
|
+
"minItems": 1,
|
|
14
|
+
"items": {
|
|
15
|
+
"type": "object",
|
|
16
|
+
"required": ["id", "type", "name", "config"],
|
|
17
|
+
"additionalProperties": false,
|
|
18
|
+
"properties": {
|
|
19
|
+
"id": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"minLength": 1
|
|
22
|
+
},
|
|
23
|
+
"type": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"minLength": 1
|
|
26
|
+
},
|
|
27
|
+
"name": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"minLength": 1
|
|
30
|
+
},
|
|
31
|
+
"config": {
|
|
32
|
+
"type": "object"
|
|
33
|
+
},
|
|
34
|
+
"inputMapping": {
|
|
35
|
+
"type": "object",
|
|
36
|
+
"additionalProperties": {
|
|
37
|
+
"type": "string"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"runCondition": {
|
|
41
|
+
"type": "string"
|
|
42
|
+
},
|
|
43
|
+
"deferExecutor": {
|
|
44
|
+
"type": "boolean"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"edges": {
|
|
50
|
+
"type": "array",
|
|
51
|
+
"items": {
|
|
52
|
+
"type": "object",
|
|
53
|
+
"required": ["from", "to", "via"],
|
|
54
|
+
"additionalProperties": false,
|
|
55
|
+
"properties": {
|
|
56
|
+
"from": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"minLength": 1
|
|
59
|
+
},
|
|
60
|
+
"to": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"minLength": 1
|
|
63
|
+
},
|
|
64
|
+
"via": {
|
|
65
|
+
"type": "string",
|
|
66
|
+
"minLength": 1
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|