@coldiq/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 (176) hide show
  1. package/dist/client.d.ts +8 -0
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +47 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/executor.d.ts +21 -0
  6. package/dist/executor.d.ts.map +1 -0
  7. package/dist/executor.js +130 -0
  8. package/dist/executor.js.map +1 -0
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +49 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/registry.d.ts +49 -0
  14. package/dist/registry.d.ts.map +1 -0
  15. package/dist/registry.js +3104 -0
  16. package/dist/registry.js.map +1 -0
  17. package/dist/tools/enrich-company.d.ts +22 -0
  18. package/dist/tools/enrich-company.d.ts.map +1 -0
  19. package/dist/tools/enrich-company.js +21 -0
  20. package/dist/tools/enrich-company.js.map +1 -0
  21. package/dist/tools/enrich-email.d.ts +24 -0
  22. package/dist/tools/enrich-email.d.ts.map +1 -0
  23. package/dist/tools/enrich-email.js +19 -0
  24. package/dist/tools/enrich-email.js.map +1 -0
  25. package/dist/tools/enrich-emails.d.ts +31 -0
  26. package/dist/tools/enrich-emails.d.ts.map +1 -0
  27. package/dist/tools/enrich-emails.js +146 -0
  28. package/dist/tools/enrich-emails.js.map +1 -0
  29. package/dist/tools/enrich-person.d.ts +26 -0
  30. package/dist/tools/enrich-person.d.ts.map +1 -0
  31. package/dist/tools/enrich-person.js +23 -0
  32. package/dist/tools/enrich-person.js.map +1 -0
  33. package/dist/tools/fetch-page-content.d.ts +22 -0
  34. package/dist/tools/fetch-page-content.d.ts.map +1 -0
  35. package/dist/tools/fetch-page-content.js +32 -0
  36. package/dist/tools/fetch-page-content.js.map +1 -0
  37. package/dist/tools/find-email.d.ts +24 -0
  38. package/dist/tools/find-email.d.ts.map +1 -0
  39. package/dist/tools/find-email.js +19 -0
  40. package/dist/tools/find-email.js.map +1 -0
  41. package/dist/tools/find-emails.d.ts +31 -0
  42. package/dist/tools/find-emails.d.ts.map +1 -0
  43. package/dist/tools/find-emails.js +146 -0
  44. package/dist/tools/find-emails.js.map +1 -0
  45. package/dist/tools/find-influencers.d.ts +29 -0
  46. package/dist/tools/find-influencers.d.ts.map +1 -0
  47. package/dist/tools/find-influencers.js +30 -0
  48. package/dist/tools/find-influencers.js.map +1 -0
  49. package/dist/tools/find-people.d.ts +26 -0
  50. package/dist/tools/find-people.d.ts.map +1 -0
  51. package/dist/tools/find-people.js +61 -0
  52. package/dist/tools/find-people.js.map +1 -0
  53. package/dist/tools/find-phone.d.ts +24 -0
  54. package/dist/tools/find-phone.d.ts.map +1 -0
  55. package/dist/tools/find-phone.js +48 -0
  56. package/dist/tools/find-phone.js.map +1 -0
  57. package/dist/tools/find-signals.d.ts +26 -0
  58. package/dist/tools/find-signals.d.ts.map +1 -0
  59. package/dist/tools/find-signals.js +82 -0
  60. package/dist/tools/find-signals.js.map +1 -0
  61. package/dist/tools/search-ads.d.ts +33 -0
  62. package/dist/tools/search-ads.d.ts.map +1 -0
  63. package/dist/tools/search-ads.js +33 -0
  64. package/dist/tools/search-ads.js.map +1 -0
  65. package/dist/tools/search-companies.d.ts +42 -0
  66. package/dist/tools/search-companies.d.ts.map +1 -0
  67. package/dist/tools/search-companies.js +37 -0
  68. package/dist/tools/search-companies.js.map +1 -0
  69. package/dist/tools/search-jobs.d.ts +51 -0
  70. package/dist/tools/search-jobs.d.ts.map +1 -0
  71. package/dist/tools/search-jobs.js +64 -0
  72. package/dist/tools/search-jobs.js.map +1 -0
  73. package/dist/tools/search-places.d.ts +47 -0
  74. package/dist/tools/search-places.d.ts.map +1 -0
  75. package/dist/tools/search-places.js +42 -0
  76. package/dist/tools/search-places.js.map +1 -0
  77. package/dist/tools/search-reddit.d.ts +27 -0
  78. package/dist/tools/search-reddit.d.ts.map +1 -0
  79. package/dist/tools/search-reddit.js +30 -0
  80. package/dist/tools/search-reddit.js.map +1 -0
  81. package/dist/tools/search-seo.d.ts +37 -0
  82. package/dist/tools/search-seo.d.ts.map +1 -0
  83. package/dist/tools/search-seo.js +49 -0
  84. package/dist/tools/search-seo.js.map +1 -0
  85. package/dist/tools/search-web.d.ts +23 -0
  86. package/dist/tools/search-web.d.ts.map +1 -0
  87. package/dist/tools/search-web.js +20 -0
  88. package/dist/tools/search-web.js.map +1 -0
  89. package/dist/tools/verify-email.d.ts +20 -0
  90. package/dist/tools/verify-email.d.ts.map +1 -0
  91. package/dist/tools/verify-email.js +15 -0
  92. package/dist/tools/verify-email.js.map +1 -0
  93. package/package.json +28 -0
  94. package/src/client.ts +60 -0
  95. package/src/executor.ts +182 -0
  96. package/src/index.ts +155 -0
  97. package/src/registry.ts +3159 -0
  98. package/src/tools/enrich-company.ts +25 -0
  99. package/src/tools/enrich-person.ts +27 -0
  100. package/src/tools/fetch-page-content.ts +36 -0
  101. package/src/tools/find-email.ts +23 -0
  102. package/src/tools/find-emails.ts +190 -0
  103. package/src/tools/find-influencers.ts +34 -0
  104. package/src/tools/find-people.ts +69 -0
  105. package/src/tools/find-phone.ts +53 -0
  106. package/src/tools/find-signals.ts +93 -0
  107. package/src/tools/search-ads.ts +44 -0
  108. package/src/tools/search-companies.ts +41 -0
  109. package/src/tools/search-jobs.ts +73 -0
  110. package/src/tools/search-places.ts +52 -0
  111. package/src/tools/search-reddit.ts +34 -0
  112. package/src/tools/search-seo.ts +59 -0
  113. package/src/tools/search-web.ts +24 -0
  114. package/src/tools/verify-email.ts +19 -0
  115. package/test-ads-live.ts +77 -0
  116. package/test-company-live.ts +91 -0
  117. package/test-email-live.ts +171 -0
  118. package/test-influencers-live.ts +66 -0
  119. package/test-jobs-live.ts +69 -0
  120. package/test-linkupapi-live.ts +137 -0
  121. package/test-phone-live.ts +41 -0
  122. package/test-places-live.ts +89 -0
  123. package/test-reddit-live.ts +66 -0
  124. package/test-search-live.ts +79 -0
  125. package/test-seo-live.ts +68 -0
  126. package/test-web-live.ts +67 -0
  127. package/tests/client.test.ts +90 -0
  128. package/tests/executor.test.ts +83 -0
  129. package/tests/gtm/01-icp-to-emails.test.ts +43 -0
  130. package/tests/gtm/02-icp-bulk-emails.test.ts +38 -0
  131. package/tests/gtm/03-icp-to-phones.test.ts +39 -0
  132. package/tests/gtm/04-funding-signal-outreach.test.ts +42 -0
  133. package/tests/gtm/05-hiring-signal-decisionmakers.test.ts +41 -0
  134. package/tests/gtm/06-intent-signal-outreach.test.ts +44 -0
  135. package/tests/gtm/07-places-to-content.test.ts +50 -0
  136. package/tests/gtm/08-domain-to-account.test.ts +44 -0
  137. package/tests/gtm/09-linkedin-to-everything.test.ts +41 -0
  138. package/tests/gtm/10-jobs-vs-signals-routing.test.ts +38 -0
  139. package/tests/gtm/11-find-vs-enrich-routing.test.ts +39 -0
  140. package/tests/gtm/12-bogus-domain-graceful.test.ts +42 -0
  141. package/tests/gtm/13-private-linkedin-graceful.test.ts +44 -0
  142. package/tests/gtm/14-empty-handoff.test.ts +43 -0
  143. package/tests/gtm/15-seo-reddit-research.test.ts +38 -0
  144. package/tests/gtm/README.md +59 -0
  145. package/tests/gtm/harness.ts +217 -0
  146. package/tests/gtm/tools-bridge.ts +232 -0
  147. package/tests/gtm-scenarios.md +32 -0
  148. package/tests/live/smoke-report.ts +255 -0
  149. package/tests/live/smoke.test.ts +134 -0
  150. package/tests/registry-enrich-person.test.ts +447 -0
  151. package/tests/registry-fetch-page-content.test.ts +90 -0
  152. package/tests/registry-find-people.test.ts +467 -0
  153. package/tests/registry-find-signals.test.ts +470 -0
  154. package/tests/registry-linkupapi.test.ts +331 -0
  155. package/tests/registry-search-companies.test.ts +188 -0
  156. package/tests/registry-search-jobs.test.ts +116 -0
  157. package/tests/registry.test.ts +2210 -0
  158. package/tests/tools/enrich-company.test.ts +92 -0
  159. package/tests/tools/enrich-email.test.ts +94 -0
  160. package/tests/tools/enrich-emails.test.ts +271 -0
  161. package/tests/tools/enrich-person.test.ts +140 -0
  162. package/tests/tools/fetch-page-content.test.ts +108 -0
  163. package/tests/tools/find-influencers.test.ts +91 -0
  164. package/tests/tools/find-people.test.ts +344 -0
  165. package/tests/tools/find-phone.test.ts +100 -0
  166. package/tests/tools/find-signals.test.ts +110 -0
  167. package/tests/tools/search-ads.test.ts +182 -0
  168. package/tests/tools/search-companies.test.ts +58 -0
  169. package/tests/tools/search-jobs.test.ts +210 -0
  170. package/tests/tools/search-places.test.ts +114 -0
  171. package/tests/tools/search-reddit.test.ts +125 -0
  172. package/tests/tools/search-seo.test.ts +183 -0
  173. package/tests/tools/search-web.test.ts +79 -0
  174. package/tests/tools/verify-email.test.ts +68 -0
  175. package/tsconfig.json +17 -0
  176. package/vitest.config.ts +7 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrich-person.js","sourceRoot":"","sources":["../../src/tools/enrich-person.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,eAAe,CAAA;AAE/C,MAAM,CAAC,MAAM,uBAAuB,GAClC,gEAAgE;IAChE,2FAA2F;IAC3F,2EAA2E,CAAA;AAE7E,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yEAAyE,CAAC;IACxH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;IAC/G,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAC/D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IACtF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;IAC1G,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mGAAmG,CAAC;IACvJ,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;CAC/E,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAA8B;IACtE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAA;IAChE,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACvG,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AACxF,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { z } from 'zod';
2
+ export declare const fetchPageContentName = "fetch_page_content";
3
+ export declare const fetchPageContentDescription: string;
4
+ export declare const fetchPageContentSchema: {
5
+ urls: z.ZodArray<z.ZodString, "many">;
6
+ include_text: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
7
+ include_summary: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
8
+ };
9
+ export declare function fetchPageContentHandler(input: Record<string, unknown>): Promise<{
10
+ content: {
11
+ type: "text";
12
+ text: string;
13
+ }[];
14
+ isError: boolean;
15
+ } | {
16
+ content: {
17
+ type: "text";
18
+ text: string;
19
+ }[];
20
+ isError?: undefined;
21
+ }>;
22
+ //# sourceMappingURL=fetch-page-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-page-content.d.ts","sourceRoot":"","sources":["../../src/tools/fetch-page-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,oBAAoB,uBAAuB,CAAA;AAExD,eAAO,MAAM,2BAA2B,QAIH,CAAA;AAErC,eAAO,MAAM,sBAAsB;;;;CAgBlC,CAAA;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;GAM3E"}
@@ -0,0 +1,32 @@
1
+ import { z } from 'zod';
2
+ import { executeWithFallback, isExecutionError } from '../executor.js';
3
+ export const fetchPageContentName = 'fetch_page_content';
4
+ export const fetchPageContentDescription = 'Fetch the full text content of one or more web pages given their URLs. ' +
5
+ 'Returns extracted page text suitable for RAG, summarisation, or fact extraction. ' +
6
+ 'Use search_web first to discover URLs, then use this tool to fetch their full text. ' +
7
+ 'Costs 1 credit per URL submitted.';
8
+ export const fetchPageContentSchema = {
9
+ urls: z
10
+ .array(z.string().url())
11
+ .min(1)
12
+ .max(10)
13
+ .describe('URLs to fetch content from (1–10 URLs per call).'),
14
+ include_text: z
15
+ .boolean()
16
+ .optional()
17
+ .default(true)
18
+ .describe('Extract and return full page text (default: true).'),
19
+ include_summary: z
20
+ .boolean()
21
+ .optional()
22
+ .default(false)
23
+ .describe('Generate a summary for each page in addition to the text (default: false).'),
24
+ };
25
+ export async function fetchPageContentHandler(input) {
26
+ const result = await executeWithFallback('fetch_page_content', input);
27
+ if (isExecutionError(result)) {
28
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }], isError: true };
29
+ }
30
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
31
+ }
32
+ //# sourceMappingURL=fetch-page-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-page-content.js","sourceRoot":"","sources":["../../src/tools/fetch-page-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEtE,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,CAAA;AAExD,MAAM,CAAC,MAAM,2BAA2B,GACtC,yEAAyE;IACzE,mFAAmF;IACnF,sFAAsF;IACtF,mCAAmC,CAAA;AAErC,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,CAAC;SACJ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;SACvB,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,CAAC,kDAAkD,CAAC;IAC/D,YAAY,EAAE,CAAC;SACZ,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,oDAAoD,CAAC;IACjE,eAAe,EAAE,CAAC;SACf,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,4EAA4E,CAAC;CAC1F,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAA8B;IAC1E,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;IACrE,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACvG,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AACxF,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ export declare const findEmailName = "find_email";
3
+ export declare const findEmailDescription = "Find a person's professional email given their name and company. Tries multiple providers in sequence until an email is found (waterfall). Returns the email and which provider found it.";
4
+ export declare const findEmailSchema: {
5
+ first_name: z.ZodOptional<z.ZodString>;
6
+ last_name: z.ZodOptional<z.ZodString>;
7
+ domain: z.ZodOptional<z.ZodString>;
8
+ company_name: z.ZodOptional<z.ZodString>;
9
+ linkedin_url: z.ZodOptional<z.ZodString>;
10
+ };
11
+ export declare function findEmailHandler(input: Record<string, unknown>): Promise<{
12
+ content: {
13
+ type: "text";
14
+ text: string;
15
+ }[];
16
+ isError: boolean;
17
+ } | {
18
+ content: {
19
+ type: "text";
20
+ text: string;
21
+ }[];
22
+ isError?: undefined;
23
+ }>;
24
+ //# sourceMappingURL=find-email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-email.d.ts","sourceRoot":"","sources":["../../src/tools/find-email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,aAAa,eAAe,CAAA;AAEzC,eAAO,MAAM,oBAAoB,8LAC4J,CAAA;AAE7L,eAAO,MAAM,eAAe;;;;;;CAM3B,CAAA;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;GAMpE"}
@@ -0,0 +1,19 @@
1
+ import { z } from 'zod';
2
+ import { executeWaterfall, isExecutionError } from '../executor.js';
3
+ export const findEmailName = 'find_email';
4
+ export const findEmailDescription = "Find a person's professional email given their name and company. Tries multiple providers in sequence until an email is found (waterfall). Returns the email and which provider found it.";
5
+ export const findEmailSchema = {
6
+ first_name: z.string().optional().describe('First name of the person'),
7
+ last_name: z.string().optional().describe('Last name of the person'),
8
+ domain: z.string().optional().describe('Company domain (e.g. "stripe.com")'),
9
+ company_name: z.string().optional().describe('Company name — alternative to domain'),
10
+ linkedin_url: z.string().optional().describe('LinkedIn profile URL — alternative to name+domain'),
11
+ };
12
+ export async function findEmailHandler(input) {
13
+ const result = await executeWaterfall('find_email', input);
14
+ if (isExecutionError(result)) {
15
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }], isError: true };
16
+ }
17
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
18
+ }
19
+ //# sourceMappingURL=find-email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-email.js","sourceRoot":"","sources":["../../src/tools/find-email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEnE,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAA;AAEzC,MAAM,CAAC,MAAM,oBAAoB,GAC/B,2LAA2L,CAAA;AAE7L,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACtE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACpE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAC5E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACpF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;CAClG,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAA8B;IACnE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;IAC1D,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACvG,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AACxF,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { z } from 'zod';
2
+ export declare const findEmailsName = "find_emails";
3
+ export declare const findEmailsDescription: string;
4
+ export declare const findEmailsSchema: {
5
+ people: z.ZodArray<z.ZodObject<{
6
+ id: z.ZodString;
7
+ first_name: z.ZodOptional<z.ZodString>;
8
+ last_name: z.ZodOptional<z.ZodString>;
9
+ domain: z.ZodOptional<z.ZodString>;
10
+ linkedin_url: z.ZodOptional<z.ZodString>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ id: string;
13
+ linkedin_url?: string | undefined;
14
+ domain?: string | undefined;
15
+ first_name?: string | undefined;
16
+ last_name?: string | undefined;
17
+ }, {
18
+ id: string;
19
+ linkedin_url?: string | undefined;
20
+ domain?: string | undefined;
21
+ first_name?: string | undefined;
22
+ last_name?: string | undefined;
23
+ }>, "many">;
24
+ };
25
+ export declare function findEmailsHandler(input: Record<string, unknown>): Promise<{
26
+ content: {
27
+ type: "text";
28
+ text: string;
29
+ }[];
30
+ }>;
31
+ //# sourceMappingURL=find-emails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-emails.d.ts","sourceRoot":"","sources":["../../src/tools/find-emails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,cAAc,gBAAgB,CAAA;AAE3C,eAAO,MAAM,qBAAqB,QAOiF,CAAA;AAEnH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;CAc5B,CAAA;AAwBD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;GAyIrE"}
@@ -0,0 +1,146 @@
1
+ import { z } from 'zod';
2
+ import { callApi } from '../client.js';
3
+ export const findEmailsName = 'find_emails';
4
+ export const findEmailsDescription = 'Find professional emails for multiple people in one batch. ' +
5
+ 'Uses bulk enrichment first, then a secondary provider for misses, then ' +
6
+ 'two additional providers in parallel for any remaining misses. ' +
7
+ 'Much faster than calling find_email one-by-one. Max 50 people per call. ' +
8
+ 'Each person needs a unique id to match results back. ' +
9
+ 'Always pass first_name, last_name, and domain — they are the primary enrichment signal. ' +
10
+ 'Also pass linkedin_url when available, but never rely on it alone as some providers cannot resolve vanity URLs.';
11
+ export const findEmailsSchema = {
12
+ people: z
13
+ .array(z.object({
14
+ id: z.string().describe("Unique identifier to match results back (e.g. person's name or a slug)"),
15
+ first_name: z.string().optional().describe('First name'),
16
+ last_name: z.string().optional().describe('Last name'),
17
+ domain: z.string().optional().describe('Company domain (e.g. "stripe.com")'),
18
+ linkedin_url: z.string().optional().describe('LinkedIn profile URL — pass when available but always include name+domain too'),
19
+ }))
20
+ .min(1)
21
+ .max(50)
22
+ .describe('People to find emails for (max 50)'),
23
+ };
24
+ function sleep(ms) {
25
+ return new Promise((resolve) => setTimeout(resolve, ms));
26
+ }
27
+ function missesOf(people, results) {
28
+ return people.filter((p) => !results.find((r) => r.id === p.id)?.email);
29
+ }
30
+ export async function findEmailsHandler(input) {
31
+ const people = input.people;
32
+ const results = people.map((p) => ({ id: p.id, email: null, provider: null }));
33
+ // Step 1: Prospeo bulk — 1 call for all people
34
+ const bulkBody = {
35
+ data: people.map((p) => p.linkedin_url
36
+ ? { identifier: p.id, linkedin_url: p.linkedin_url }
37
+ : { identifier: p.id, first_name: p.first_name, last_name: p.last_name, company_name: p.domain }),
38
+ };
39
+ const bulkRes = await callApi('POST', '/prospeo/bulk-enrich-person', bulkBody);
40
+ if (bulkRes.ok) {
41
+ const data = bulkRes.data;
42
+ for (const item of data.results ?? []) {
43
+ const email = item.person?.email?.email;
44
+ if (typeof email === 'string' && email.includes('@')) {
45
+ const hit = results.find((r) => r.id === item.identifier);
46
+ if (hit) {
47
+ hit.email = email;
48
+ hit.provider = 'prospeo';
49
+ }
50
+ }
51
+ }
52
+ }
53
+ // Step 2: FullEnrich batch for Prospeo misses (async, better European coverage)
54
+ const afterProspeo = missesOf(people, results);
55
+ if (afterProspeo.length > 0) {
56
+ const feBody = {
57
+ name: 'mcp-enrich-batch',
58
+ data: afterProspeo.map((p) => ({
59
+ first_name: p.first_name,
60
+ last_name: p.last_name,
61
+ domain: p.domain,
62
+ ...(p.linkedin_url ? { linkedin_url: p.linkedin_url } : {}),
63
+ enrich_fields: ['contact.emails'],
64
+ })),
65
+ };
66
+ const feCreateRes = await callApi('POST', '/fullenrich/contact/enrich/bulk', feBody);
67
+ if (feCreateRes.ok) {
68
+ const enrichmentId = feCreateRes.data.enrichment_id;
69
+ if (enrichmentId) {
70
+ const deadline = Date.now() + 90_000;
71
+ while (Date.now() < deadline) {
72
+ await sleep(5000);
73
+ const pollRes = await callApi('GET', `/fullenrich/contact/enrich/bulk/${enrichmentId}`);
74
+ if (!pollRes.ok)
75
+ continue;
76
+ const pd = pollRes.data;
77
+ const status = pd.status;
78
+ if (status === 'DONE' || status === 'FAILED') {
79
+ if (status === 'DONE') {
80
+ const feItems = pd.data;
81
+ if (Array.isArray(feItems)) {
82
+ feItems.forEach((item, idx) => {
83
+ const person = afterProspeo[idx];
84
+ const hit = results.find((r) => r.id === person?.id);
85
+ if (!hit || hit.email)
86
+ return;
87
+ const emails = item.emails;
88
+ if (Array.isArray(emails) && emails.length > 0 && typeof emails[0] === 'string' && emails[0].includes('@')) {
89
+ hit.email = emails[0];
90
+ hit.provider = 'fullenrich';
91
+ }
92
+ });
93
+ }
94
+ }
95
+ break;
96
+ }
97
+ }
98
+ }
99
+ }
100
+ }
101
+ // Step 3: parallel fallback for remaining misses — FindyMail then IcyPeas per person
102
+ const afterFullEnrich = missesOf(people, results);
103
+ await Promise.all(afterFullEnrich.map(async (person) => {
104
+ const hit = results.find((r) => r.id === person.id);
105
+ const fullName = [person.first_name, person.last_name].filter(Boolean).join(' ');
106
+ const fmRes = await callApi('POST', '/findymail/search/name', {
107
+ name: fullName,
108
+ domain: person.domain,
109
+ });
110
+ if (fmRes.ok) {
111
+ const d = fmRes.data;
112
+ if (typeof d.email === 'string' && d.email.includes('@')) {
113
+ hit.email = d.email;
114
+ hit.provider = 'findymail';
115
+ return;
116
+ }
117
+ }
118
+ const icyRes = await callApi('POST', '/icypeas/email-search', {
119
+ firstname: person.first_name,
120
+ lastname: person.last_name,
121
+ domainOrCompany: person.domain,
122
+ });
123
+ if (icyRes.ok) {
124
+ const d = icyRes.data;
125
+ const email = typeof d.email === 'string' && d.email.includes('@')
126
+ ? d.email
127
+ : Array.isArray(d.emails) && typeof d.emails[0] === 'string' && d.emails[0].includes('@')
128
+ ? d.emails[0]
129
+ : null;
130
+ if (email) {
131
+ hit.email = email;
132
+ hit.provider = 'icypeas';
133
+ }
134
+ }
135
+ }));
136
+ const found = results.filter((r) => r.email !== null).length;
137
+ return {
138
+ content: [
139
+ {
140
+ type: 'text',
141
+ text: JSON.stringify({ data: { results, found, total: people.length } }, null, 2),
142
+ },
143
+ ],
144
+ };
145
+ }
146
+ //# sourceMappingURL=find-emails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-emails.js","sourceRoot":"","sources":["../../src/tools/find-emails.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ export declare const findInfluencersName = "find_influencers";
3
+ export declare const findInfluencersDescription = "Discover and find influencers/creators on Instagram, YouTube, TikTok, Twitch, Twitter, and OnlyFans via 2 providers (Influencers Club Similar, Influencers Club Discovery). Routes by input: handle set \u2192 lookalike search (influencers_similar) runs first; no handle \u2192 keyword/filter discovery. Filters: location, gender, type (creator/business), AI natural language search, sort. Cost: 1 credit per result returned.";
4
+ export declare const findInfluencersSchema: {
5
+ platform: z.ZodEnum<["instagram", "youtube", "tiktok", "twitch", "twitter", "onlyfans"]>;
6
+ limit: z.ZodDefault<z.ZodNumber>;
7
+ page: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
8
+ sort_by: z.ZodOptional<z.ZodEnum<["relevancy", "number_of_followers", "engagement_rate"]>>;
9
+ sort_order: z.ZodOptional<z.ZodEnum<["asc", "desc"]>>;
10
+ ai_search: z.ZodOptional<z.ZodString>;
11
+ location: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
12
+ gender: z.ZodOptional<z.ZodEnum<["male", "female"]>>;
13
+ type: z.ZodOptional<z.ZodEnum<["creator", "business"]>>;
14
+ handle: z.ZodOptional<z.ZodString>;
15
+ };
16
+ export declare function findInfluencersHandler(input: Record<string, unknown>): Promise<{
17
+ content: {
18
+ type: "text";
19
+ text: string;
20
+ }[];
21
+ isError: boolean;
22
+ } | {
23
+ content: {
24
+ type: "text";
25
+ text: string;
26
+ }[];
27
+ isError?: undefined;
28
+ }>;
29
+ //# sourceMappingURL=find-influencers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-influencers.d.ts","sourceRoot":"","sources":["../../src/tools/find-influencers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,mBAAmB,qBAAqB,CAAA;AAErD,eAAO,MAAM,0BAA0B,2aACyX,CAAA;AAEha,eAAO,MAAM,qBAAqB;;;;;;;;;;;CAiBjC,CAAA;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;GAM1E"}
@@ -0,0 +1,30 @@
1
+ import { z } from 'zod';
2
+ import { executeWithFallback, isExecutionError } from '../executor.js';
3
+ export const findInfluencersName = 'find_influencers';
4
+ export const findInfluencersDescription = 'Discover and find influencers/creators on Instagram, YouTube, TikTok, Twitch, Twitter, and OnlyFans via 2 providers (Influencers Club Similar, Influencers Club Discovery). Routes by input: handle set → lookalike search (influencers_similar) runs first; no handle → keyword/filter discovery. Filters: location, gender, type (creator/business), AI natural language search, sort. Cost: 1 credit per result returned.';
5
+ export const findInfluencersSchema = {
6
+ platform: z.enum(['instagram', 'youtube', 'tiktok', 'twitch', 'twitter', 'onlyfans'])
7
+ .describe('Target platform.'),
8
+ limit: z.number().int().min(1).max(100).default(25)
9
+ .describe('Max creators to return (1–100). 1 credit per result.'),
10
+ page: z.number().int().min(1).default(1).optional()
11
+ .describe('Page number for pagination.'),
12
+ sort_by: z.enum(['relevancy', 'number_of_followers', 'engagement_rate']).optional(),
13
+ sort_order: z.enum(['asc', 'desc']).optional(),
14
+ ai_search: z.string().optional()
15
+ .describe('Natural language query e.g. "fitness influencers in NYC who post about nutrition".'),
16
+ location: z.array(z.string()).optional()
17
+ .describe('Country or city names e.g. ["United States", "New York"].'),
18
+ gender: z.enum(['male', 'female']).optional(),
19
+ type: z.enum(['creator', 'business']).optional(),
20
+ handle: z.string().optional()
21
+ .describe('Find creators similar to this handle. Routes to lookalike search. No @ prefix.'),
22
+ };
23
+ export async function findInfluencersHandler(input) {
24
+ const result = await executeWithFallback('find_influencers', input);
25
+ if (isExecutionError(result)) {
26
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }], isError: true };
27
+ }
28
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
29
+ }
30
+ //# sourceMappingURL=find-influencers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-influencers.js","sourceRoot":"","sources":["../../src/tools/find-influencers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEtE,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,CAAA;AAErD,MAAM,CAAC,MAAM,0BAA0B,GACrC,8ZAA8Z,CAAA;AAEha,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;SAClF,QAAQ,CAAC,kBAAkB,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;SAChD,QAAQ,CAAC,sDAAsD,CAAC;IACnE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;SAChD,QAAQ,CAAC,6BAA6B,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,qBAAqB,EAAE,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnF,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC7B,QAAQ,CAAC,oFAAoF,CAAC;IACjG,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;SACrC,QAAQ,CAAC,2DAA2D,CAAC;IACxE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC7C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;IAChD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC1B,QAAQ,CAAC,gFAAgF,CAAC;CAC9F,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAA8B;IACzE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;IACnE,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACvG,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AACxF,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+ export declare const findPeopleName = "find_people";
3
+ export declare const findPeopleDescription: string;
4
+ export declare const findPeopleSchema: {
5
+ company_linkedin_urls: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
6
+ company_domains: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
7
+ job_titles: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
8
+ seniorities: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
9
+ locations: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
10
+ keywords: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
11
+ limit: z.ZodDefault<z.ZodNumber>;
12
+ };
13
+ export declare function findPeopleHandler(input: Record<string, unknown>): Promise<{
14
+ content: {
15
+ type: "text";
16
+ text: string;
17
+ }[];
18
+ isError: boolean;
19
+ } | {
20
+ content: {
21
+ type: "text";
22
+ text: string;
23
+ }[];
24
+ isError?: undefined;
25
+ }>;
26
+ //# sourceMappingURL=find-people.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-people.d.ts","sourceRoot":"","sources":["../../src/tools/find-people.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,cAAc,gBAAgB,CAAA;AAE3C,eAAO,MAAM,qBAAqB,QAS0B,CAAA;AAE5D,eAAO,MAAM,gBAAgB;;;;;;;;CAQ5B,CAAA;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;GAwCrE"}
@@ -0,0 +1,61 @@
1
+ import { z } from 'zod';
2
+ import { executeWithFallback, isExecutionError } from '../executor.js';
3
+ import { callApi } from '../client.js';
4
+ import { getProviders } from '../registry.js';
5
+ export const findPeopleName = 'find_people';
6
+ export const findPeopleDescription = 'Find people at specific companies by job title. ' +
7
+ 'Use this — never search_web — to find contacts, executives, or LinkedIn profiles at known companies. ' +
8
+ 'Do not fall back to search_web when results look uncertain or LinkedIn URLs seem wrong — trust what this tool returns. ' +
9
+ 'ALWAYS pass all companies in a single call — never loop and call once per company. ' +
10
+ 'Set limit = (desired results per company) × (number of companies). ' +
11
+ 'Prefer company_linkedin_urls when available — they make the search faster. Only pass company_domains when you have no LinkedIn URLs. ' +
12
+ 'Pass job_titles EXACTLY as stated — never expand or generate variants (e.g. do NOT turn "CEO" into ["CEO", "Chief Executive Officer", "Founder"]). LeadsFactory handles fuzzy title matching internally; adding variants wastes personas and degrades results. ' +
13
+ 'Do NOT pass seniorities unless explicitly asked — job titles alone produce better results. ' +
14
+ 'Returns names, titles, LinkedIn URLs. Default limit: 25.';
15
+ export const findPeopleSchema = {
16
+ company_linkedin_urls: z.array(z.string()).optional().describe('Company LinkedIn URLs (preferred over domains when available, e.g. ["https://linkedin.com/company/microsoft"])'),
17
+ company_domains: z.array(z.string()).optional().describe('Company domains to search (e.g. ["microsoft.com", "google.com"]). Use only when LinkedIn URLs are not available.'),
18
+ job_titles: z.array(z.string()).optional().describe('Target job titles (e.g. ["CEO", "VP of Sales"])'),
19
+ seniorities: z.array(z.string()).optional().describe('Seniority levels (e.g. ["c_suite", "vp", "director"])'),
20
+ locations: z.array(z.string()).optional().describe('Person or company locations'),
21
+ keywords: z.array(z.string()).optional().describe('Free-text keyword search terms (e.g. ["growth", "AI"])'),
22
+ limit: z.number().min(1).max(500).default(25).describe('Max results across all companies combined (default: 25, max: 500). For multiple companies multiply: e.g. 10 companies × 5 each = 50.'),
23
+ };
24
+ export async function findPeopleHandler(input) {
25
+ const result = await executeWithFallback('find_people', input);
26
+ if (isExecutionError(result)) {
27
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }], isError: true };
28
+ }
29
+ // Gap-fill: if LeadsFactory missed some domains, try Apollo for those.
30
+ // Only runs when domains were the input — if we sent LinkedIn URLs, no_results_domains
31
+ // is unreliable (LF may resolve arbitrary domains from URLs, e.g. linkedin.com itself).
32
+ const inputHadDomains = Array.isArray(input.company_domains) && input.company_domains.length > 0;
33
+ const inputHadLinkedInUrls = Array.isArray(input.company_linkedin_urls) && input.company_linkedin_urls.length > 0;
34
+ if (result._meta.provider === 'leadsfactory' && inputHadDomains && !inputHadLinkedInUrls) {
35
+ const data = result.data;
36
+ const missedDomains = data.no_results_domains ?? [];
37
+ if (missedDomains.length > 0) {
38
+ const apollo = getProviders('find_people').find((p) => p.id === 'apollo');
39
+ if (apollo) {
40
+ const gapInput = { ...input, company_domains: missedDomains, company_linkedin_urls: undefined };
41
+ const payload = apollo.mapParams(gapInput);
42
+ const apolloRes = await callApi(apollo.method, apollo.endpoint, payload.body, payload.queryParams);
43
+ if (apolloRes.ok && apollo.hasResult(apolloRes.data)) {
44
+ const merged = {
45
+ ...data,
46
+ gap_fill: {
47
+ provider: 'apollo',
48
+ domains: missedDomains,
49
+ ...apolloRes.data,
50
+ },
51
+ };
52
+ return {
53
+ content: [{ type: 'text', text: JSON.stringify({ ...result, data: merged }, null, 2) }],
54
+ };
55
+ }
56
+ }
57
+ }
58
+ }
59
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
60
+ }
61
+ //# sourceMappingURL=find-people.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-people.js","sourceRoot":"","sources":["../../src/tools/find-people.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ export declare const findPhoneName = "find_phone";
3
+ export declare const findPhoneDescription = "Find a direct phone number for a person. Accepts a LinkedIn URL, or first+last name with company domain/name. Phone lookups are expensive (10+ credits) \u2014 use only when specifically needed.";
4
+ export declare const findPhoneSchema: {
5
+ linkedin_url: z.ZodOptional<z.ZodString>;
6
+ first_name: z.ZodOptional<z.ZodString>;
7
+ last_name: z.ZodOptional<z.ZodString>;
8
+ company_domain: z.ZodOptional<z.ZodString>;
9
+ company_name: z.ZodOptional<z.ZodString>;
10
+ };
11
+ export declare function findPhoneHandler(input: Record<string, unknown>): Promise<{
12
+ content: {
13
+ type: "text";
14
+ text: string;
15
+ }[];
16
+ isError: boolean;
17
+ } | {
18
+ content: {
19
+ type: "text";
20
+ text: string;
21
+ }[];
22
+ isError?: undefined;
23
+ }>;
24
+ //# sourceMappingURL=find-phone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-phone.d.ts","sourceRoot":"","sources":["../../src/tools/find-phone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,aAAa,eAAe,CAAA;AAEzC,eAAO,MAAM,oBAAoB,sMAC+J,CAAA;AAEhM,eAAO,MAAM,eAAe;;;;;;CAM3B,CAAA;AAwBD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;GAcpE"}
@@ -0,0 +1,48 @@
1
+ import { z } from 'zod';
2
+ import { executeWithFallback, isExecutionError } from '../executor.js';
3
+ export const findPhoneName = 'find_phone';
4
+ export const findPhoneDescription = 'Find a direct phone number for a person. Accepts a LinkedIn URL, or first+last name with company domain/name. Phone lookups are expensive (10+ credits) — use only when specifically needed.';
5
+ export const findPhoneSchema = {
6
+ linkedin_url: z.string().url().optional().describe('LinkedIn profile URL'),
7
+ first_name: z.string().optional().describe('First name (required when no LinkedIn URL)'),
8
+ last_name: z.string().optional().describe('Last name (required when no LinkedIn URL)'),
9
+ company_domain: z.string().optional().describe('Company domain, e.g. coldiq.com'),
10
+ company_name: z.string().optional().describe('Company name (alternative to company_domain)'),
11
+ };
12
+ const inputSchema = z
13
+ .object({
14
+ linkedin_url: z.string().url().optional(),
15
+ first_name: z.string().optional(),
16
+ last_name: z.string().optional(),
17
+ company_domain: z.string().optional(),
18
+ company_name: z.string().optional(),
19
+ })
20
+ .superRefine((val, ctx) => {
21
+ const hasLinkedIn = typeof val.linkedin_url === 'string' && val.linkedin_url.length > 0;
22
+ const hasName = typeof val.first_name === 'string' && val.first_name.length > 0 &&
23
+ typeof val.last_name === 'string' && val.last_name.length > 0;
24
+ const hasCompany = (typeof val.company_domain === 'string' && val.company_domain.length > 0) ||
25
+ (typeof val.company_name === 'string' && val.company_name.length > 0);
26
+ if (!hasLinkedIn && !(hasName && hasCompany)) {
27
+ ctx.addIssue({
28
+ code: 'custom',
29
+ message: 'Provide either linkedin_url or both first_name+last_name and company_domain/company_name',
30
+ });
31
+ }
32
+ });
33
+ export async function findPhoneHandler(input) {
34
+ const validation = inputSchema.safeParse(input);
35
+ if (!validation.success) {
36
+ const msg = validation.error.issues.map((i) => i.message).join('; ');
37
+ return {
38
+ content: [{ type: 'text', text: JSON.stringify({ error: msg }, null, 2) }],
39
+ isError: true,
40
+ };
41
+ }
42
+ const result = await executeWithFallback('find_phone', input);
43
+ if (isExecutionError(result)) {
44
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }], isError: true };
45
+ }
46
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
47
+ }
48
+ //# sourceMappingURL=find-phone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-phone.js","sourceRoot":"","sources":["../../src/tools/find-phone.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+ export declare const findSignalsName = "find_signals";
3
+ export declare const findSignalsDescription: string;
4
+ export declare const findSignalsSchema: {
5
+ signal_type: z.ZodEnum<["funding", "acquisition", "hiring", "job_change", "news", "intent", "startup_post"]>;
6
+ companies: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
7
+ domains: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
8
+ since: z.ZodOptional<z.ZodString>;
9
+ industries: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
10
+ countries: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
11
+ limit: z.ZodDefault<z.ZodNumber>;
12
+ };
13
+ export declare function findSignalsHandler(input: Record<string, unknown>): Promise<{
14
+ content: {
15
+ type: "text";
16
+ text: string;
17
+ }[];
18
+ isError: boolean;
19
+ } | {
20
+ content: {
21
+ type: "text";
22
+ text: string;
23
+ }[];
24
+ isError?: undefined;
25
+ }>;
26
+ //# sourceMappingURL=find-signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-signals.d.ts","sourceRoot":"","sources":["../../src/tools/find-signals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,eAAe,iBAAiB,CAAA;AAE7C,eAAO,MAAM,sBAAsB,QAM+G,CAAA;AAElJ,eAAO,MAAM,iBAAiB;;;;;;;;CAoC7B,CAAA;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;GAyCtE"}