@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,240 @@
1
+ export type AddToInmailCampaignInput = {
2
+ senderId: string;
3
+ leads: Array<{
4
+ linkedinUrl: string;
5
+ subject: string;
6
+ message: string;
7
+ }>;
8
+ skipDuplicates?: boolean;
9
+ };
10
+ export type AddToConnectionCampaignInput = {
11
+ senderId: string;
12
+ leads: Array<{
13
+ linkedinUrl: string;
14
+ message: string;
15
+ }>;
16
+ skipDuplicates?: boolean;
17
+ };
18
+ export type AddToCommentCampaignInput = {
19
+ senderId: string;
20
+ posts: Array<{
21
+ postUrl: string;
22
+ comment: string;
23
+ reactionType?: string;
24
+ }>;
25
+ skipDuplicates?: boolean;
26
+ };
27
+ export type DirectCampaignControlInput = {
28
+ senderId: string;
29
+ type: "inmail_campaign" | "connection_campaign" | "comment_campaign";
30
+ };
31
+ export type DirectCampaignAddRowsResponse = {
32
+ tableId: string;
33
+ inserted: number;
34
+ skipped: number;
35
+ rowIds: string[];
36
+ };
37
+ export type StartDirectCampaignResponse = {
38
+ success: boolean;
39
+ tableId: string;
40
+ campaignStatus: string;
41
+ resumed: boolean;
42
+ };
43
+ export type PauseDirectCampaignResponse = {
44
+ success: boolean;
45
+ tableId: string;
46
+ campaignStatus: string;
47
+ };
48
+ export type GetOrCreateDirectCampaignTableResponse = {
49
+ tableId: string;
50
+ tableName: string;
51
+ campaignOfferId?: string | null;
52
+ created: boolean;
53
+ };
54
+ export type GetEngagedPostsInput = {
55
+ senderId: string;
56
+ };
57
+ export type GetEngagedPostsResponse = {
58
+ postUrls: string[];
59
+ };
60
+ export declare const directCampaignToolDefinitions: ({
61
+ name: string;
62
+ description: string;
63
+ inputSchema: {
64
+ type: string;
65
+ properties: {
66
+ senderId: {
67
+ type: string;
68
+ description: string;
69
+ };
70
+ leads: {
71
+ type: string;
72
+ description: string;
73
+ items: {
74
+ type: string;
75
+ properties: {
76
+ linkedinUrl: {
77
+ type: string;
78
+ };
79
+ subject: {
80
+ type: string;
81
+ };
82
+ message: {
83
+ type: string;
84
+ };
85
+ };
86
+ required: string[];
87
+ };
88
+ };
89
+ skipDuplicates: {
90
+ type: string;
91
+ description: string;
92
+ };
93
+ posts?: undefined;
94
+ type?: undefined;
95
+ };
96
+ required: string[];
97
+ };
98
+ } | {
99
+ name: string;
100
+ description: string;
101
+ inputSchema: {
102
+ type: string;
103
+ properties: {
104
+ senderId: {
105
+ type: string;
106
+ description: string;
107
+ };
108
+ leads: {
109
+ type: string;
110
+ description: string;
111
+ items: {
112
+ type: string;
113
+ properties: {
114
+ linkedinUrl: {
115
+ type: string;
116
+ };
117
+ message: {
118
+ type: string;
119
+ };
120
+ subject?: undefined;
121
+ };
122
+ required: string[];
123
+ };
124
+ };
125
+ skipDuplicates: {
126
+ type: string;
127
+ description: string;
128
+ };
129
+ posts?: undefined;
130
+ type?: undefined;
131
+ };
132
+ required: string[];
133
+ };
134
+ } | {
135
+ name: string;
136
+ description: string;
137
+ inputSchema: {
138
+ type: string;
139
+ properties: {
140
+ senderId: {
141
+ type: string;
142
+ description: string;
143
+ };
144
+ posts: {
145
+ type: string;
146
+ description: string;
147
+ items: {
148
+ type: string;
149
+ properties: {
150
+ postUrl: {
151
+ type: string;
152
+ };
153
+ comment: {
154
+ type: string;
155
+ };
156
+ reactionType: {
157
+ type: string;
158
+ description: string;
159
+ enum: string[];
160
+ };
161
+ };
162
+ required: string[];
163
+ };
164
+ };
165
+ skipDuplicates: {
166
+ type: string;
167
+ description: string;
168
+ };
169
+ leads?: undefined;
170
+ type?: undefined;
171
+ };
172
+ required: string[];
173
+ };
174
+ } | {
175
+ name: string;
176
+ description: string;
177
+ inputSchema: {
178
+ type: string;
179
+ properties: {
180
+ senderId: {
181
+ type: string;
182
+ description?: undefined;
183
+ };
184
+ type: {
185
+ type: string;
186
+ enum: string[];
187
+ description: string;
188
+ };
189
+ leads?: undefined;
190
+ skipDuplicates?: undefined;
191
+ posts?: undefined;
192
+ };
193
+ required: string[];
194
+ };
195
+ } | {
196
+ name: string;
197
+ description: string;
198
+ inputSchema: {
199
+ type: string;
200
+ properties: {
201
+ senderId: {
202
+ type: string;
203
+ description: string;
204
+ };
205
+ type: {
206
+ type: string;
207
+ enum: string[];
208
+ description: string;
209
+ };
210
+ leads?: undefined;
211
+ skipDuplicates?: undefined;
212
+ posts?: undefined;
213
+ };
214
+ required: string[];
215
+ };
216
+ } | {
217
+ name: string;
218
+ description: string;
219
+ inputSchema: {
220
+ type: string;
221
+ properties: {
222
+ senderId: {
223
+ type: string;
224
+ description: string;
225
+ };
226
+ leads?: undefined;
227
+ skipDuplicates?: undefined;
228
+ posts?: undefined;
229
+ type?: undefined;
230
+ };
231
+ required: string[];
232
+ };
233
+ })[];
234
+ export declare function addToInmailCampaign(input: AddToInmailCampaignInput): Promise<DirectCampaignAddRowsResponse>;
235
+ export declare function addToConnectionCampaign(input: AddToConnectionCampaignInput): Promise<DirectCampaignAddRowsResponse>;
236
+ export declare function addToCommentCampaign(input: AddToCommentCampaignInput): Promise<DirectCampaignAddRowsResponse>;
237
+ export declare function startDirectCampaign(input: DirectCampaignControlInput): Promise<StartDirectCampaignResponse>;
238
+ export declare function pauseDirectCampaign(input: DirectCampaignControlInput): Promise<PauseDirectCampaignResponse>;
239
+ export declare function getOrCreateDirectCampaignTable(input: DirectCampaignControlInput): Promise<GetOrCreateDirectCampaignTableResponse>;
240
+ export declare function getEngagedPosts(input: GetEngagedPostsInput): Promise<GetEngagedPostsResponse>;
@@ -0,0 +1,250 @@
1
+ import { getApi } from "../api.js";
2
+ /**
3
+ * Sanitize a comment/message before saving to campaign table.
4
+ * Removes LLM giveaways (em-dashes, smart quotes, etc.) and normalizes text.
5
+ * Mirrors the logic from src/lib/utils/sanitizeText.ts (sanitizeTextForSequence).
6
+ */
7
+ function sanitizeForCampaign(text) {
8
+ if (typeof text !== "string")
9
+ return text;
10
+ return (text
11
+ // Convert literal \n strings to actual newlines
12
+ .replace(/\\n/g, "\n")
13
+ // Remove problematic control characters (preserve \n and \r)
14
+ .replace(/[\u0000-\u0009\u000B\u000C\u000E-\u001F]/g, "")
15
+ // Replace smart/curly apostrophes with standard apostrophe
16
+ .replace(/[\u2018\u2019]/g, "'")
17
+ // Replace smart/curly quotes with standard quotes
18
+ .replace(/[\u201C\u201D]/g, '"')
19
+ // Replace em-dashes with " - "
20
+ .replace(/[\u2014]/g, " - ")
21
+ // Replace en-dashes with "-"
22
+ .replace(/[\u2013]/g, "-")
23
+ // Remove other problematic unicode
24
+ .replace(/[\u2028\u2029\uFEFF]/g, " ")
25
+ // Remove bullet characters that LLMs like to insert
26
+ .replace(/[•◦▪▸►]/g, "-")
27
+ // Collapse multiple spaces into one
28
+ .replace(/ {2,}/g, " ")
29
+ // Trim leading/trailing whitespace per line
30
+ .replace(/^[ \t]+|[ \t]+$/gm, "")
31
+ // Normalize unicode to composed form
32
+ .normalize("NFC")
33
+ .trim());
34
+ }
35
+ export const directCampaignToolDefinitions = [
36
+ {
37
+ name: "add_to_inmail_campaign",
38
+ description: "Add leads to a sender's InMail direct campaign table (dedupes by default). Auto-creates the table if missing.",
39
+ inputSchema: {
40
+ type: "object",
41
+ properties: {
42
+ senderId: { type: "string", description: "Outbound sender ID" },
43
+ leads: {
44
+ type: "array",
45
+ description: "Leads to add (LinkedIn URL + subject + message)",
46
+ items: {
47
+ type: "object",
48
+ properties: {
49
+ linkedinUrl: { type: "string" },
50
+ subject: { type: "string" },
51
+ message: { type: "string" },
52
+ },
53
+ required: ["linkedinUrl", "subject", "message"],
54
+ },
55
+ },
56
+ skipDuplicates: {
57
+ type: "boolean",
58
+ description: "Skip rows already in table (default true)",
59
+ },
60
+ },
61
+ required: ["senderId", "leads"],
62
+ },
63
+ },
64
+ {
65
+ name: "add_to_connection_campaign",
66
+ description: "Add leads to a sender's Connection direct campaign table (dedupes by default). Auto-creates the table if missing.",
67
+ inputSchema: {
68
+ type: "object",
69
+ properties: {
70
+ senderId: { type: "string", description: "Outbound sender ID" },
71
+ leads: {
72
+ type: "array",
73
+ description: "Leads to add (LinkedIn URL + message)",
74
+ items: {
75
+ type: "object",
76
+ properties: {
77
+ linkedinUrl: { type: "string" },
78
+ message: { type: "string" },
79
+ },
80
+ required: ["linkedinUrl", "message"],
81
+ },
82
+ },
83
+ skipDuplicates: {
84
+ type: "boolean",
85
+ description: "Skip rows already in table (default true)",
86
+ },
87
+ },
88
+ required: ["senderId", "leads"],
89
+ },
90
+ },
91
+ {
92
+ name: "add_to_comment_campaign",
93
+ description: "Add posts to a sender's Comment direct campaign table (dedupes by default). Auto-creates the table if missing.",
94
+ inputSchema: {
95
+ type: "object",
96
+ properties: {
97
+ senderId: { type: "string", description: "Outbound sender ID" },
98
+ posts: {
99
+ type: "array",
100
+ description: "Posts to add (Post URL + comment)",
101
+ items: {
102
+ type: "object",
103
+ properties: {
104
+ postUrl: { type: "string" },
105
+ comment: { type: "string" },
106
+ reactionType: {
107
+ type: "string",
108
+ description: "Reaction type: like (default), celebrate, support, love, insightful, funny",
109
+ enum: [
110
+ "like",
111
+ "celebrate",
112
+ "support",
113
+ "love",
114
+ "insightful",
115
+ "funny",
116
+ ],
117
+ },
118
+ },
119
+ required: ["postUrl", "comment"],
120
+ },
121
+ },
122
+ skipDuplicates: {
123
+ type: "boolean",
124
+ description: "Skip rows already in table (default true)",
125
+ },
126
+ },
127
+ required: ["senderId", "posts"],
128
+ },
129
+ },
130
+ {
131
+ name: "start_direct_campaign",
132
+ description: "Start a direct campaign for a sender (sets status to ACTIVE).",
133
+ inputSchema: {
134
+ type: "object",
135
+ properties: {
136
+ senderId: { type: "string" },
137
+ type: {
138
+ type: "string",
139
+ enum: ["inmail_campaign", "connection_campaign", "comment_campaign"],
140
+ description: "Direct campaign type",
141
+ },
142
+ },
143
+ required: ["senderId", "type"],
144
+ },
145
+ },
146
+ {
147
+ name: "pause_direct_campaign",
148
+ description: "Pause a direct campaign for a sender (sets status to PAUSED).",
149
+ inputSchema: {
150
+ type: "object",
151
+ properties: {
152
+ senderId: { type: "string" },
153
+ type: {
154
+ type: "string",
155
+ enum: ["inmail_campaign", "connection_campaign", "comment_campaign"],
156
+ description: "Direct campaign type",
157
+ },
158
+ },
159
+ required: ["senderId", "type"],
160
+ },
161
+ },
162
+ {
163
+ name: "get_or_create_direct_campaign_table",
164
+ description: "Get or create the direct campaign workflow table for a sender and type (comment_campaign, inmail_campaign, connection_campaign). Returns the tableId and whether it was created.",
165
+ inputSchema: {
166
+ type: "object",
167
+ properties: {
168
+ senderId: { type: "string", description: "Outbound sender ID" },
169
+ type: {
170
+ type: "string",
171
+ enum: ["inmail_campaign", "connection_campaign", "comment_campaign"],
172
+ description: "Direct campaign type",
173
+ },
174
+ },
175
+ required: ["senderId", "type"],
176
+ },
177
+ },
178
+ {
179
+ name: "get_engaged_posts",
180
+ description: "Get all post URLs a sender has already engaged with or has scheduled, so you can avoid duplicates when drafting new comments.",
181
+ inputSchema: {
182
+ type: "object",
183
+ properties: {
184
+ senderId: { type: "string", description: "Outbound sender ID" },
185
+ },
186
+ required: ["senderId"],
187
+ },
188
+ },
189
+ ];
190
+ export async function addToInmailCampaign(input) {
191
+ const api = getApi();
192
+ const { senderId, skipDuplicates } = input;
193
+ const rows = input.leads.map((l) => ({
194
+ ...l,
195
+ subject: sanitizeForCampaign(l.subject),
196
+ message: sanitizeForCampaign(l.message),
197
+ }));
198
+ return api.post("/api/v3/direct-campaigns/inmail_campaign/rows", {
199
+ senderId,
200
+ rows,
201
+ skipDuplicates,
202
+ });
203
+ }
204
+ export async function addToConnectionCampaign(input) {
205
+ const api = getApi();
206
+ const { senderId, skipDuplicates } = input;
207
+ const rows = input.leads.map((l) => ({
208
+ ...l,
209
+ message: sanitizeForCampaign(l.message),
210
+ }));
211
+ return api.post("/api/v3/direct-campaigns/connection_campaign/rows", {
212
+ senderId,
213
+ rows,
214
+ skipDuplicates,
215
+ });
216
+ }
217
+ export async function addToCommentCampaign(input) {
218
+ const api = getApi();
219
+ const { senderId, skipDuplicates } = input;
220
+ const rows = input.posts.map((p) => ({
221
+ ...p,
222
+ comment: sanitizeForCampaign(p.comment),
223
+ }));
224
+ return api.post("/api/v3/direct-campaigns/comment_campaign/rows", {
225
+ senderId,
226
+ rows,
227
+ skipDuplicates,
228
+ });
229
+ }
230
+ export async function startDirectCampaign(input) {
231
+ const api = getApi();
232
+ return api.post(`/api/v3/direct-campaigns/${input.type}/start`, {
233
+ senderId: input.senderId,
234
+ });
235
+ }
236
+ export async function pauseDirectCampaign(input) {
237
+ const api = getApi();
238
+ return api.post(`/api/v3/direct-campaigns/${input.type}/pause`, {
239
+ senderId: input.senderId,
240
+ });
241
+ }
242
+ export async function getOrCreateDirectCampaignTable(input) {
243
+ const api = getApi();
244
+ return api.get(`/api/v3/direct-campaigns/${input.type}?senderId=${encodeURIComponent(input.senderId)}`);
245
+ }
246
+ export async function getEngagedPosts(input) {
247
+ const api = getApi();
248
+ const senderId = input.senderId;
249
+ return api.get(`/api/v3/direct-campaigns/comment_campaign/engaged-posts?senderId=${encodeURIComponent(senderId)}`);
250
+ }
@@ -0,0 +1,94 @@
1
+ import { getAuthStatus } from "./auth.js";
2
+ export type BootstrapEngageInput = {
3
+ senderId?: string;
4
+ };
5
+ export type BootstrapEngageSender = {
6
+ id: string;
7
+ displayName: string;
8
+ linkedinProfileUrl: string | null;
9
+ };
10
+ export type BootstrapEngageResult = {
11
+ ok: false;
12
+ authStatus: Awaited<ReturnType<typeof getAuthStatus>>;
13
+ } | {
14
+ ok: true;
15
+ authStatus: Awaited<ReturnType<typeof getAuthStatus>>;
16
+ needsUserChoice: true;
17
+ reason: "no_senders" | "multiple_senders" | "unknown_sender";
18
+ senders: BootstrapEngageSender[];
19
+ addSenderPath: "/outbound/senders";
20
+ } | {
21
+ ok: true;
22
+ authStatus: Awaited<ReturnType<typeof getAuthStatus>>;
23
+ needsUserChoice: false;
24
+ selected: {
25
+ senderId: string;
26
+ senderDisplayName: string;
27
+ senderLinkedinProfileUrl: string | null;
28
+ commentCampaignTableId: string;
29
+ tableCreated: boolean;
30
+ engagedPostUrls: string[];
31
+ };
32
+ };
33
+ export type BootstrapEngageMultiInput = {
34
+ senderIds?: string[];
35
+ allSenders?: boolean;
36
+ };
37
+ export type BootstrapEngageMultiSenderResult = {
38
+ senderId: string;
39
+ senderDisplayName: string;
40
+ senderLinkedinProfileUrl: string | null;
41
+ commentCampaignTableId: string;
42
+ tableCreated: boolean;
43
+ engagedPostUrls: string[];
44
+ hasConfig: boolean;
45
+ };
46
+ export type BootstrapEngageMultiResult = {
47
+ ok: false;
48
+ error: string;
49
+ } | {
50
+ ok: true;
51
+ senders: BootstrapEngageMultiSenderResult[];
52
+ globalEngagedPostUrls: string[];
53
+ };
54
+ export declare const engageBootstrapToolDefinitions: ({
55
+ name: string;
56
+ description: string;
57
+ inputSchema: {
58
+ type: string;
59
+ properties: {
60
+ senderId: {
61
+ type: string;
62
+ description: string;
63
+ };
64
+ senderIds?: undefined;
65
+ allSenders?: undefined;
66
+ };
67
+ required: never[];
68
+ additionalProperties: boolean;
69
+ };
70
+ } | {
71
+ name: string;
72
+ description: string;
73
+ inputSchema: {
74
+ type: string;
75
+ properties: {
76
+ senderIds: {
77
+ type: string;
78
+ items: {
79
+ type: string;
80
+ };
81
+ description: string;
82
+ };
83
+ allSenders: {
84
+ type: string;
85
+ description: string;
86
+ };
87
+ senderId?: undefined;
88
+ };
89
+ required: never[];
90
+ additionalProperties: boolean;
91
+ };
92
+ })[];
93
+ export declare function bootstrapEngage(input?: BootstrapEngageInput): Promise<BootstrapEngageResult>;
94
+ export declare function bootstrapEngageMulti(input?: BootstrapEngageMultiInput): Promise<BootstrapEngageMultiResult>;