@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.
Files changed (200) hide show
  1. package/.claude-plugin/plugin.json +12 -0
  2. package/.mcp.json +9 -0
  3. package/README.md +355 -0
  4. package/dist/api.d.ts +21 -0
  5. package/dist/api.js +73 -0
  6. package/dist/auth.d.ts +60 -0
  7. package/dist/auth.js +246 -0
  8. package/dist/engage-memory.d.ts +63 -0
  9. package/dist/engage-memory.js +354 -0
  10. package/dist/index-dev.d.ts +2 -0
  11. package/dist/index-dev.js +17 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.js +8 -0
  14. package/dist/server.d.ts +1 -0
  15. package/dist/server.js +499 -0
  16. package/dist/skills.d.ts +11 -0
  17. package/dist/skills.js +97 -0
  18. package/dist/tools/auth.d.ts +30 -0
  19. package/dist/tools/auth.js +124 -0
  20. package/dist/tools/blueprint-commit.d.ts +174 -0
  21. package/dist/tools/blueprint-commit.js +286 -0
  22. package/dist/tools/bootstrap.d.ts +64 -0
  23. package/dist/tools/bootstrap.js +246 -0
  24. package/dist/tools/campaigns.d.ts +589 -0
  25. package/dist/tools/campaigns.js +892 -0
  26. package/dist/tools/cells.d.ts +58 -0
  27. package/dist/tools/cells.js +48 -0
  28. package/dist/tools/context.d.ts +88 -0
  29. package/dist/tools/context.js +271 -0
  30. package/dist/tools/csv-domains.d.ts +73 -0
  31. package/dist/tools/csv-domains.js +464 -0
  32. package/dist/tools/csv-linkedin.d.ts +102 -0
  33. package/dist/tools/csv-linkedin.js +712 -0
  34. package/dist/tools/direct-campaigns.d.ts +240 -0
  35. package/dist/tools/direct-campaigns.js +250 -0
  36. package/dist/tools/engage-bootstrap.d.ts +94 -0
  37. package/dist/tools/engage-bootstrap.js +205 -0
  38. package/dist/tools/engage-discovery.d.ts +78 -0
  39. package/dist/tools/engage-discovery.js +150 -0
  40. package/dist/tools/engage-memory.d.ts +181 -0
  41. package/dist/tools/engage-memory.js +143 -0
  42. package/dist/tools/engage-state.d.ts +72 -0
  43. package/dist/tools/engage-state.js +62 -0
  44. package/dist/tools/enrichment.d.ts +167 -0
  45. package/dist/tools/enrichment.js +174 -0
  46. package/dist/tools/flow-preflight.d.ts +68 -0
  47. package/dist/tools/flow-preflight.js +138 -0
  48. package/dist/tools/framework.d.ts +44 -0
  49. package/dist/tools/framework.js +153 -0
  50. package/dist/tools/interaction-mode.d.ts +27 -0
  51. package/dist/tools/interaction-mode.js +102 -0
  52. package/dist/tools/leads.d.ts +2417 -0
  53. package/dist/tools/leads.js +2307 -0
  54. package/dist/tools/linkedin.d.ts +210 -0
  55. package/dist/tools/linkedin.js +229 -0
  56. package/dist/tools/navigation.d.ts +91 -0
  57. package/dist/tools/navigation.js +381 -0
  58. package/dist/tools/one-off.d.ts +229 -0
  59. package/dist/tools/one-off.js +273 -0
  60. package/dist/tools/processing.d.ts +70 -0
  61. package/dist/tools/processing.js +56 -0
  62. package/dist/tools/prompts.d.ts +211 -0
  63. package/dist/tools/prompts.js +210 -0
  64. package/dist/tools/provider-preflight.d.ts +21 -0
  65. package/dist/tools/provider-preflight.js +59 -0
  66. package/dist/tools/readiness.d.ts +261 -0
  67. package/dist/tools/readiness.js +510 -0
  68. package/dist/tools/rows.d.ts +126 -0
  69. package/dist/tools/rows.js +105 -0
  70. package/dist/tools/rubrics.d.ts +497 -0
  71. package/dist/tools/rubrics.js +681 -0
  72. package/dist/tools/senders.d.ts +44 -0
  73. package/dist/tools/senders.js +69 -0
  74. package/dist/tools/sequencer.d.ts +127 -0
  75. package/dist/tools/sequencer.js +194 -0
  76. package/dist/tools/tables.d.ts +35 -0
  77. package/dist/tools/tables.js +36 -0
  78. package/dist/tools/verify-row.d.ts +36 -0
  79. package/dist/tools/verify-row.js +38 -0
  80. package/dist/tools/workspaces.d.ts +140 -0
  81. package/dist/tools/workspaces.js +139 -0
  82. package/dist/utils/workspace-root.d.ts +1 -0
  83. package/dist/utils/workspace-root.js +39 -0
  84. package/package.json +46 -0
  85. package/skills/building-gtm-tables/SKILL.md +216 -0
  86. package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
  87. package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
  88. package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
  89. package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
  90. package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
  91. package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
  92. package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
  93. package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
  94. package/skills/building-gtm-tables/references/verify-loop.md +74 -0
  95. package/skills/campaign-messages/SKILL.md +173 -0
  96. package/skills/campaign-messages/flow.v1.json +75 -0
  97. package/skills/craft-message/SKILL.md +401 -0
  98. package/skills/create-campaign/ARCHITECTURE.md +232 -0
  99. package/skills/create-campaign/DISCUSS.md +296 -0
  100. package/skills/create-campaign/FLOW_ASCII.md +240 -0
  101. package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
  102. package/skills/create-campaign/README.md +142 -0
  103. package/skills/create-campaign/SKILL.md +286 -0
  104. package/skills/create-campaign/context/README.md +67 -0
  105. package/skills/create-campaign/context/_TEMPLATE.md +12 -0
  106. package/skills/create-campaign/context/context.md +35 -0
  107. package/skills/create-campaign/context/learnings.md +16 -0
  108. package/skills/create-campaign/context/registry.json +19 -0
  109. package/skills/create-campaign/core/flow.v1.json +217 -0
  110. package/skills/create-campaign/core/policy.md +191 -0
  111. package/skills/create-campaign/core/providers/apollo.json +35 -0
  112. package/skills/create-campaign/core/providers/prospeo.json +34 -0
  113. package/skills/create-campaign/core/providers/registry.json +31 -0
  114. package/skills/create-campaign/core/providers/sales-nav.json +37 -0
  115. package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
  116. package/skills/create-campaign/references/brief-template.md +64 -0
  117. package/skills/create-campaign/references/campaign-quality.md +84 -0
  118. package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
  119. package/skills/create-campaign/references/offer-patterns.md +108 -0
  120. package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
  121. package/skills/create-campaign/references/question-examples.md +167 -0
  122. package/skills/create-campaign/references/token-fill-examples.md +81 -0
  123. package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
  124. package/skills/create-campaign-brief/DISCUSS.md +64 -0
  125. package/skills/create-campaign-brief/README.md +176 -0
  126. package/skills/create-campaign-brief/SKILL.md +537 -0
  127. package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
  128. package/skills/create-campaign-brief/references/brief-template.md +220 -0
  129. package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
  130. package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
  131. package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
  132. package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
  133. package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
  134. package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
  135. package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
  136. package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
  137. package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
  138. package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
  139. package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
  140. package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
  141. package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
  142. package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
  143. package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
  144. package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
  145. package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
  146. package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
  147. package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
  148. package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
  149. package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
  150. package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
  151. package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
  152. package/skills/create-campaign-v2/SKILL.md +1619 -0
  153. package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
  154. package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
  155. package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
  156. package/skills/create-campaign-v2/core/policy.md +82 -0
  157. package/skills/create-campaign-v2/references/ai-tells.md +253 -0
  158. package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
  159. package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
  160. package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
  161. package/skills/create-campaign-v2/references/filter-leads.md +495 -0
  162. package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
  163. package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
  164. package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
  165. package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
  166. package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
  167. package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
  168. package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
  169. package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
  170. package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
  171. package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
  172. package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
  173. package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
  174. package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
  175. package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
  176. package/skills/create-campaign-v2-validation/SKILL.md +296 -0
  177. package/skills/create-post/SKILL.md +1308 -0
  178. package/skills/create-rubric/SKILL.md +251 -0
  179. package/skills/engage/SKILL.md +549 -0
  180. package/skills/engage/core/README.md +23 -0
  181. package/skills/engage/core/proven-searches.json +11 -0
  182. package/skills/engage/core/style-guide.template.md +47 -0
  183. package/skills/engage/core/tracked-people.json +10 -0
  184. package/skills/enrich-prospects/SKILL.md +97 -0
  185. package/skills/find-leads/SKILL.md +467 -0
  186. package/skills/generate-messages/SKILL.md +2361 -0
  187. package/skills/interview/SKILL.md +132 -0
  188. package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
  189. package/skills/interview/core/ICP.template.md +54 -0
  190. package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
  191. package/skills/providers/apollo.md +520 -0
  192. package/skills/providers/prospeo.md +398 -0
  193. package/skills/providers/sales-nav.md +372 -0
  194. package/skills/providers/signal-discovery.md +495 -0
  195. package/skills/research/SKILL.md +258 -0
  196. package/skills/research/config.json +9 -0
  197. package/skills/research/override.md +13 -0
  198. package/skills/research-prospect/SKILL.md +99 -0
  199. package/skills/research-sender/SKILL.md +158 -0
  200. 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
+ }