@coldiq/mcp 0.3.25 → 0.3.30

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 (40) hide show
  1. package/dist/registry.d.ts.map +1 -1
  2. package/dist/registry.js +66 -0
  3. package/dist/registry.js.map +1 -1
  4. package/dist/tools/enrich-company-bulk.d.ts +2 -2
  5. package/dist/tools/enrich-person-bulk.d.ts +2 -2
  6. package/dist/tools/enrich-person.d.ts.map +1 -1
  7. package/dist/tools/enrich-person.js +4 -1
  8. package/dist/tools/enrich-person.js.map +1 -1
  9. package/dist/tools/find-emails-bulk.d.ts +2 -2
  10. package/dist/tools/find-emails-bulk.d.ts.map +1 -1
  11. package/dist/tools/find-emails-bulk.js +5 -1
  12. package/dist/tools/find-emails-bulk.js.map +1 -1
  13. package/dist/tools/find-emails.d.ts +2 -2
  14. package/dist/tools/find-emails.d.ts.map +1 -1
  15. package/dist/tools/find-emails.js +4 -1
  16. package/dist/tools/find-emails.js.map +1 -1
  17. package/dist/tools/find-people.d.ts.map +1 -1
  18. package/dist/tools/find-people.js +1 -0
  19. package/dist/tools/find-people.js.map +1 -1
  20. package/dist/tools/get-bulk-job.d.ts.map +1 -1
  21. package/dist/tools/get-bulk-job.js +7 -4
  22. package/dist/tools/get-bulk-job.js.map +1 -1
  23. package/dist/tools/search-companies.d.ts +1 -0
  24. package/dist/tools/search-companies.d.ts.map +1 -1
  25. package/dist/tools/search-companies.js +2 -1
  26. package/dist/tools/search-companies.js.map +1 -1
  27. package/dist/tools/verify-emails-bulk.d.ts.map +1 -1
  28. package/dist/tools/verify-emails-bulk.js +5 -0
  29. package/dist/tools/verify-emails-bulk.js.map +1 -1
  30. package/package.json +1 -1
  31. package/src/registry.ts +55 -0
  32. package/src/tools/enrich-person.ts +4 -1
  33. package/src/tools/find-emails-bulk.ts +5 -1
  34. package/src/tools/find-emails.ts +4 -1
  35. package/src/tools/find-people.ts +1 -0
  36. package/src/tools/get-bulk-job.ts +7 -4
  37. package/src/tools/search-companies.ts +2 -1
  38. package/src/tools/verify-emails-bulk.ts +5 -0
  39. package/tests/registry-search-companies.test.ts +3 -2
  40. package/tests/registry.test.ts +4 -3
@@ -10,15 +10,15 @@ export declare const enrichPersonBulkSchema: {
10
10
  company_name: z.ZodOptional<z.ZodString>;
11
11
  domain: z.ZodOptional<z.ZodString>;
12
12
  }, "strip", z.ZodTypeAny, {
13
- linkedin_url?: string | undefined;
14
13
  domain?: string | undefined;
14
+ linkedin_url?: string | undefined;
15
15
  first_name?: string | undefined;
16
16
  company_name?: string | undefined;
17
17
  last_name?: string | undefined;
18
18
  email?: string | undefined;
19
19
  }, {
20
- linkedin_url?: string | undefined;
21
20
  domain?: string | undefined;
21
+ linkedin_url?: string | undefined;
22
22
  first_name?: string | undefined;
23
23
  company_name?: string | undefined;
24
24
  last_name?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"enrich-person.d.ts","sourceRoot":"","sources":["../../src/tools/enrich-person.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,gBAAgB,kBAAkB,CAAA;AAE/C,eAAO,MAAM,uBAAuB,QAI2G,CAAA;AAE/I,eAAO,MAAM,kBAAkB;;;;;;;;;CAS9B,CAAA;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAEvE"}
1
+ {"version":3,"file":"enrich-person.d.ts","sourceRoot":"","sources":["../../src/tools/enrich-person.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,gBAAgB,kBAAkB,CAAA;AAE/C,eAAO,MAAM,uBAAuB,QAOiI,CAAA;AAErK,eAAO,MAAM,kBAAkB;;;;;;;;;CAS9B,CAAA;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAEvE"}
@@ -5,7 +5,10 @@ export const enrichPersonName = 'enrich_person';
5
5
  export const enrichPersonDescription = "Look up a person's LinkedIn profile and professional details. " +
6
6
  'Accepts either an email address (reverse lookup) or name + company (profile enrichment). ' +
7
7
  'Returns LinkedIn URL, headline, location, current role, and profile data. ' +
8
- 'ColdIQ automatically picks the best provider based on which input fields are present — pass use_providers only if you need a specific tool.';
8
+ 'ColdIQ automatically picks the best provider based on which input fields are present — pass use_providers only if you need a specific tool. ' +
9
+ 'CHECK the response `_meta` before trusting a reverse-email match: `_meta.match_confidence` (0–1, when the provider gives a score) ' +
10
+ 'and `_meta.input_match` (true = the record carries the exact queried email; false = the person\'s email is on a DIFFERENT domain, a strong ' +
11
+ 'wrong-person signal; absent = same domain but a different mailbox, or no email to confirm against). A low/false signal means verify the identity before using it.';
9
12
  export const enrichPersonSchema = {
10
13
  email: z.string().email().optional().describe('Email address for reverse lookup — identify the person behind the email'),
11
14
  first_name: z.string().optional().describe("Person's first name (use with last_name + company_name or domain)"),
@@ -1 +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,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAEzE,MAAM,CAAC,MAAM,gBAAgB,GAAG,eAAe,CAAA;AAE/C,MAAM,CAAC,MAAM,uBAAuB,GAClC,gEAAgE;IAChE,2FAA2F;IAC3F,4EAA4E;IAC5E,6IAA6I,CAAA;AAE/I,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;IAC9E,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gLAAgL,yBAAyB,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,qEAAqE,CAAC;CACnW,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAA8B;IACtE,OAAO,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAA;AAC1C,CAAC"}
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,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAEzE,MAAM,CAAC,MAAM,gBAAgB,GAAG,eAAe,CAAA;AAE/C,MAAM,CAAC,MAAM,uBAAuB,GAClC,gEAAgE;IAChE,2FAA2F;IAC3F,4EAA4E;IAC5E,8IAA8I;IAC9I,oIAAoI;IACpI,6IAA6I;IAC7I,mKAAmK,CAAA;AAErK,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;IAC9E,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gLAAgL,yBAAyB,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,qEAAqE,CAAC;CACnW,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAA8B;IACtE,OAAO,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAA;AAC1C,CAAC"}
@@ -9,15 +9,15 @@ export declare const findEmailsBulkSchema: {
9
9
  domain: z.ZodOptional<z.ZodString>;
10
10
  linkedin_url: z.ZodOptional<z.ZodString>;
11
11
  }, "strip", z.ZodTypeAny, {
12
+ domain?: string | undefined;
12
13
  id?: string | undefined;
13
14
  linkedin_url?: string | undefined;
14
- domain?: string | undefined;
15
15
  first_name?: string | undefined;
16
16
  last_name?: string | undefined;
17
17
  }, {
18
+ domain?: string | undefined;
18
19
  id?: string | undefined;
19
20
  linkedin_url?: string | undefined;
20
- domain?: string | undefined;
21
21
  first_name?: string | undefined;
22
22
  last_name?: string | undefined;
23
23
  }>, "many">;
@@ -1 +1 @@
1
- {"version":3,"file":"find-emails-bulk.d.ts","sourceRoot":"","sources":["../../src/tools/find-emails-bulk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,kBAAkB,qBAAqB,CAAA;AAEpD,eAAO,MAAM,yBAAyB,QAIsE,CAAA;AAE5G,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;CAehC,CAAA;AAED,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAGzE"}
1
+ {"version":3,"file":"find-emails-bulk.d.ts","sourceRoot":"","sources":["../../src/tools/find-emails-bulk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,kBAAkB,qBAAqB,CAAA;AAEpD,eAAO,MAAM,yBAAyB,QAQY,CAAA;AAElD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;CAehC,CAAA;AAED,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAGzE"}
@@ -4,7 +4,11 @@ export const findEmailsBulkName = 'find_emails_bulk';
4
4
  export const findEmailsBulkDescription = 'Find professional emails for up to 5,000 people in one ASYNC job. Returns a job_id immediately — this does NOT return emails inline. ' +
5
5
  'Poll get_bulk_job(job_id) until status is "done" (usually minutes), then read the found/not_found summary and page through rows. ' +
6
6
  'Each person should have first_name + last_name + domain (people missing those come back as not_found and are not charged). ' +
7
- 'Charged only per found email. For 50 or fewer people that you want back inline, use find_emails instead.';
7
+ 'Charged only per found email. A "found" row means an email was LOCATED, not verified deliverable: each row\'s ' +
8
+ 'result carries a `confidence` (high/medium/low/unknown) — treat medium/low/unknown as unverified guesses and run ' +
9
+ 'verify_emails_bulk before sending, or you risk bounces. The 202 response includes `credits_reserved` (worst-case hold, ' +
10
+ 'settled to actual on completion) and a `low_balance_warning` when your balance is running low. For 50 or fewer people that ' +
11
+ 'you want back inline, use find_emails instead.';
8
12
  export const findEmailsBulkSchema = {
9
13
  people: z
10
14
  .array(z.object({
@@ -1 +1 @@
1
- {"version":3,"file":"find-emails-bulk.js","sourceRoot":"","sources":["../../src/tools/find-emails-bulk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAA;AAEpD,MAAM,CAAC,MAAM,yBAAyB,GACpC,uIAAuI;IACvI,mIAAmI;IACnI,6HAA6H;IAC7H,0GAA0G,CAAA;AAE5G,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,MAAM,EAAE,CAAC;SACN,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yFAAyF,CAAC;QAC7H,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QACtD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QAC5E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KAChF,CAAC,CACH;SACA,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,IAAI,CAAC;SACT,QAAQ,CAAC,gGAAgG,CAAC;IAC7G,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;CACjG,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAA8B;IACxE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,yBAAyB,EAAE,KAAK,CAAC,CAAA;IACnE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAA;AACnG,CAAC"}
1
+ {"version":3,"file":"find-emails-bulk.js","sourceRoot":"","sources":["../../src/tools/find-emails-bulk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAA;AAEpD,MAAM,CAAC,MAAM,yBAAyB,GACpC,uIAAuI;IACvI,mIAAmI;IACnI,6HAA6H;IAC7H,gHAAgH;IAChH,mHAAmH;IACnH,yHAAyH;IACzH,6HAA6H;IAC7H,gDAAgD,CAAA;AAElD,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,MAAM,EAAE,CAAC;SACN,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yFAAyF,CAAC;QAC7H,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QACtD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QAC5E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KAChF,CAAC,CACH;SACA,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,IAAI,CAAC;SACT,QAAQ,CAAC,gGAAgG,CAAC;IAC7G,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;CACjG,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAA8B;IACxE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,yBAAyB,EAAE,KAAK,CAAC,CAAA;IACnE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAA;AACnG,CAAC"}
@@ -10,14 +10,14 @@ export declare const findEmailsSchema: {
10
10
  linkedin_url: z.ZodOptional<z.ZodString>;
11
11
  }, "strip", z.ZodTypeAny, {
12
12
  id: string;
13
- linkedin_url?: string | undefined;
14
13
  domain?: string | undefined;
14
+ linkedin_url?: string | undefined;
15
15
  first_name?: string | undefined;
16
16
  last_name?: string | undefined;
17
17
  }, {
18
18
  id: string;
19
- linkedin_url?: string | undefined;
20
19
  domain?: string | undefined;
20
+ linkedin_url?: string | undefined;
21
21
  first_name?: string | undefined;
22
22
  last_name?: string | undefined;
23
23
  }>, "many">;
@@ -1 +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;AAIvB,eAAO,MAAM,cAAc,gBAAgB,CAAA;AAE3C,eAAO,MAAM,qBAAqB,QAOqE,CAAA;AAEvG,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;CAe5B,CAAA;AASD,KAAK,UAAU,GAAG;IAAE,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAMlF,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CA0C3F"}
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;AAIvB,eAAO,MAAM,cAAc,gBAAgB,CAAA;AAE3C,eAAO,MAAM,qBAAqB,QAUyB,CAAA;AAE3D,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;CAe5B,CAAA;AASD,KAAK,UAAU,GAAG;IAAE,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAMlF,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CA0C3F"}
@@ -8,7 +8,10 @@ export const findEmailsDescription = 'Find professional emails for multiple peop
8
8
  'Each person needs a unique id to match results back. ' +
9
9
  'Always pass first_name, last_name, and domain — they are the primary enrichment signal. ' +
10
10
  'Also pass linkedin_url when available, but never rely on it alone as some providers cannot resolve vanity URLs. ' +
11
- 'ColdIQ automatically picks the best waterfall — pass use_providers only if you need specific tools.';
11
+ 'ColdIQ automatically picks the best waterfall — pass use_providers only if you need specific tools. ' +
12
+ 'A returned email means one was LOCATED, not verified deliverable: each result carries a `confidence` ' +
13
+ '(high/medium/low/unknown) — treat medium/low/unknown as unverified guesses and run verify_email / ' +
14
+ 'verify_emails_bulk before sending, or you risk bounces.';
12
15
  export const findEmailsSchema = {
13
16
  people: z
14
17
  .array(z.object({
@@ -1 +1 @@
1
- {"version":3,"file":"find-emails.js","sourceRoot":"","sources":["../../src/tools/find-emails.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"find-emails.js","sourceRoot":"","sources":["../../src/tools/find-emails.ts"],"names":[],"mappings":"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"}
@@ -1 +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;AAIvB,eAAO,MAAM,cAAc,gBAAgB,CAAA;AAE3C,eAAO,MAAM,qBAAqB,QAWiJ,CAAA;AAEnL,eAAO,MAAM,gBAAgB;;;;;;;;;;;;CAY5B,CAAA;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAErE"}
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;AAIvB,eAAO,MAAM,cAAc,gBAAgB,CAAA;AAE3C,eAAO,MAAM,qBAAqB,QAYiJ,CAAA;AAEnL,eAAO,MAAM,gBAAgB;;;;;;;;;;;;CAY5B,CAAA;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAErE"}
@@ -4,6 +4,7 @@ import { getProvidersForCapability } from '../utils/provider-resolver.js';
4
4
  export const findPeopleName = 'find_people';
5
5
  export const findPeopleDescription = 'Find people at specific companies by job title. ' +
6
6
  'CRITICAL: pass ALL companies in ONE call — never loop one call per company. Each call runs a ~90s async job, so looping N companies costs ~N×90s while one batched call stays ~90s total for the same data. ' +
7
+ 'PRACTICAL LIMIT: the search fans out one sub-job per company under a ~85s edge budget, so ≈2–3 companies complete per call; with more companies the call may return PARTIAL results — check `_meta.partial` / `_meta.companies_complete` / `_meta.companies_total` and re-run the unfinished companies in a follow-up call. For large multi-company lists, split into batches of ~2–3 companies. ' +
7
8
  'Set limit = (desired results per company) × (number of companies). ' +
8
9
  'Use this — never search_web — to find contacts, executives, or LinkedIn profiles at known companies. ' +
9
10
  'Do not fall back to search_web when results look uncertain or LinkedIn URLs seem wrong — trust what this tool returns. ' +
@@ -1 +1 @@
1
- {"version":3,"file":"find-people.js","sourceRoot":"","sources":["../../src/tools/find-people.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAEzE,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAA;AAE3C,MAAM,CAAC,MAAM,qBAAqB,GAChC,kDAAkD;IAClD,8MAA8M;IAC9M,qEAAqE;IACrE,uGAAuG;IACvG,yHAAyH;IACzH,uIAAuI;IACvI,iQAAiQ;IACjQ,6FAA6F;IAC7F,uHAAuH;IACvH,oMAAoM;IACpM,iLAAiL,CAAA;AAEnL,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,qBAAqB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gHAAgH,CAAC;IAChL,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kHAAkH,CAAC;IAC5K,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;IACtG,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IAC7G,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qPAAqP,CAAC;IACzS,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;IAC3G,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,6OAA6O,CAAC;IACrS,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iJAAiJ,CAAC;IACzM,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,2bAA2b,CAAC;IAC/f,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4UAA4U,CAAC;IACrX,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gLAAgL,yBAAyB,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,qEAAqE,CAAC;CACjW,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA8B;IACpE,OAAO,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAA;AAC1C,CAAC"}
1
+ {"version":3,"file":"find-people.js","sourceRoot":"","sources":["../../src/tools/find-people.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAEzE,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAA;AAE3C,MAAM,CAAC,MAAM,qBAAqB,GAChC,kDAAkD;IAClD,8MAA8M;IAC9M,mYAAmY;IACnY,qEAAqE;IACrE,uGAAuG;IACvG,yHAAyH;IACzH,uIAAuI;IACvI,iQAAiQ;IACjQ,6FAA6F;IAC7F,uHAAuH;IACvH,oMAAoM;IACpM,iLAAiL,CAAA;AAEnL,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,qBAAqB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gHAAgH,CAAC;IAChL,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kHAAkH,CAAC;IAC5K,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;IACtG,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IAC7G,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qPAAqP,CAAC;IACzS,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;IAC3G,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,6OAA6O,CAAC;IACrS,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iJAAiJ,CAAC;IACzM,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,2bAA2b,CAAC;IAC/f,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4UAA4U,CAAC;IACrX,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gLAAgL,yBAAyB,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,qEAAqE,CAAC;CACjW,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA8B;IACpE,OAAO,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAA;AAC1C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-bulk-job.d.ts","sourceRoot":"","sources":["../../src/tools/get-bulk-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,cAAc,iBAAiB,CAAA;AAE5C,eAAO,MAAM,qBAAqB,QAK2C,CAAA;AAE7E,eAAO,MAAM,gBAAgB;;;;CAI5B,CAAA;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAIrE"}
1
+ {"version":3,"file":"get-bulk-job.d.ts","sourceRoot":"","sources":["../../src/tools/get-bulk-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,cAAc,iBAAiB,CAAA;AAE5C,eAAO,MAAM,qBAAqB,QAQsB,CAAA;AAExD,eAAO,MAAM,gBAAgB;;;;CAI5B,CAAA;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAIrE"}
@@ -2,10 +2,13 @@ import { z } from 'zod';
2
2
  import { callApi } from '../client.js';
3
3
  export const getBulkJobName = 'get_bulk_job';
4
4
  export const getBulkJobDescription = 'Poll any async bulk job (verify_emails_bulk, find_emails_bulk, enrich_person_bulk, enrich_company_bulk, find_phone_bulk). ' +
5
- 'Returns { status, items_total, items_processed, summary, page }. Poll until status is "done" (or "timed_out"). Use the `summary` ' +
6
- 'per-verdict counts for totals — do NOT expect all rows inline: rows come one page at a time (default 100). Each row echoes its ' +
7
- 'submitted `input`, so you can map verdicts back to your submissions without tracking order. To page, OMIT cursor for the first page, ' +
8
- 'then call again with cursor = page.next_cursor until next_cursor is null.';
5
+ 'Returns { status, items_total, items_processed, summary, coverage, credits_reserved, credits_charged, page }. Poll until status is "done" (or "timed_out"). ' +
6
+ 'Use the `summary` per-verdict counts for totals — do NOT expect all rows inline: rows come one page at a time (default 100). ' +
7
+ 'The `coverage` block {conclusive, skipped, unverifiable, failed, pending} tells you how much was truly resolved: `skipped` rows (per-row ' +
8
+ '`result.reason` chunk_failed/not_returned/timed_out) were never conclusively checked and are safe to re-submit; `failed` is a hard error (retry unlikely to help). ' +
9
+ '`credits_charged` (null until settled) is the actual spend; `credits_reserved` is the worst-case hold. Each row echoes its submitted `input`, ' +
10
+ 'so you can map verdicts back to your submissions without tracking order. To page, OMIT cursor for the first page, then call again with ' +
11
+ 'cursor = page.next_cursor until next_cursor is null.';
9
12
  export const getBulkJobSchema = {
10
13
  job_id: z.number().int().describe('The job_id returned by a *_bulk submit tool.'),
11
14
  cursor: z.number().int().optional().describe('Pagination cursor from the previous page.next_cursor. Omit for the first page (an inclusive start row index — cursor=0 returns the first row, so never pass a negative or "offset" value).'),
@@ -1 +1 @@
1
- {"version":3,"file":"get-bulk-job.js","sourceRoot":"","sources":["../../src/tools/get-bulk-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAA;AAE5C,MAAM,CAAC,MAAM,qBAAqB,GAChC,4HAA4H;IAC5H,mIAAmI;IACnI,iIAAiI;IACjI,uIAAuI;IACvI,2EAA2E,CAAA;AAE7E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;IACjF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4LAA4L,CAAC;IAC1O,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;CACvG,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA8B;IACpE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAA;IACjC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,UAAU,EAAE,IAAI,CAAC,CAAA;IAClE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAA;AACnG,CAAC"}
1
+ {"version":3,"file":"get-bulk-job.js","sourceRoot":"","sources":["../../src/tools/get-bulk-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAA;AAE5C,MAAM,CAAC,MAAM,qBAAqB,GAChC,4HAA4H;IAC5H,8JAA8J;IAC9J,+HAA+H;IAC/H,2IAA2I;IAC3I,qKAAqK;IACrK,gJAAgJ;IAChJ,yIAAyI;IACzI,sDAAsD,CAAA;AAExD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;IACjF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4LAA4L,CAAC;IAC1O,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;CACvG,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA8B;IACpE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAA;IACjC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,UAAU,EAAE,IAAI,CAAC,CAAA;IAClE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAA;AACnG,CAAC"}
@@ -3,6 +3,7 @@ export declare const searchCompaniesName = "search_companies";
3
3
  export declare const searchCompaniesDescription: string;
4
4
  export declare const searchCompaniesSchema: {
5
5
  keywords: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
6
+ similar_to_domains: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
6
7
  countries: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
7
8
  locations: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
8
9
  industries: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -1 +1 @@
1
- {"version":3,"file":"search-companies.d.ts","sourceRoot":"","sources":["../../src/tools/search-companies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,mBAAmB,qBAAqB,CAAA;AAErD,eAAO,MAAM,0BAA0B,QAEkV,CAAA;AAEzX,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BjC,CAAA;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAE1E"}
1
+ {"version":3,"file":"search-companies.d.ts","sourceRoot":"","sources":["../../src/tools/search-companies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,mBAAmB,qBAAqB,CAAA;AAErD,eAAO,MAAM,0BAA0B,QAEkV,CAAA;AAEzX,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BjC,CAAA;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAE1E"}
@@ -2,10 +2,11 @@ import { z } from 'zod';
2
2
  import { callVerb } from '../verb-client.js';
3
3
  import { getProvidersForCapability } from '../utils/provider-resolver.js';
4
4
  export const searchCompaniesName = 'search_companies';
5
- export const searchCompaniesDescription = 'Search B2B companies by industry, size, geography, founding year, tech stack, funding, revenue, exclusion lists, and hiring signals. Routing is automatic: strict firmographic filters (revenue, employee bands, exclusion lists) get high-precision providers first; tech-stack and funding-stage filters route to specialized providers; loose keyword/geo searches fall back to broad providers; a LinkedIn Sales Navigator search URL enables URL-based discovery as a final fallback. For buying-intent topic discovery (find companies associated with intent keywords like "sales automation" or "lead generation"), pass `keywords` with `use_providers: ["theirstack"]` — this routes to TheirStack\'s intent-keyword index instead of the default full-text match. For "fast-growing" companies there is no exact workforce-growth % filter anywhere — pass min_workforce_growth_pct (and/or is_hiring / a recent-funding filter) and ColdIQ routes to active-hiring and recently-funded providers, the practical proxies for growth. ColdIQ automatically picks the best provider — pass use_providers only if you need a specific tool. Default limit: 25. ' +
5
+ export const searchCompaniesDescription = 'Search B2B companies by industry, size, geography, founding year, tech stack, funding, revenue, exclusion lists, and hiring signals. To build a lookalike TAM from example accounts, pass `similar_to_domains` (seed company domains) — the request routes to DiscoLike\'s lookalike discovery over 70M companies, optionally narrowed by keywords/geo/size. Routing is otherwise automatic: strict firmographic filters (revenue, employee bands, exclusion lists) get high-precision providers first; tech-stack and funding-stage filters route to specialized providers; loose keyword/geo searches fall back to broad providers; a LinkedIn Sales Navigator search URL enables URL-based discovery as a final fallback. For buying-intent topic discovery (find companies associated with intent keywords like "sales automation" or "lead generation"), pass `keywords` with `use_providers: ["theirstack"]` — this routes to TheirStack\'s intent-keyword index instead of the default full-text match. For "fast-growing" companies there is no exact workforce-growth % filter anywhere — pass min_workforce_growth_pct (and/or is_hiring / a recent-funding filter) and ColdIQ routes to active-hiring and recently-funded providers, the practical proxies for growth. ColdIQ automatically picks the best provider — pass use_providers only if you need a specific tool. Default limit: 25. ' +
6
6
  'Response is compact by default (name, domain, website, linkedin_url, employees, revenue, industry, country, city, founded_year, categories) — everything needed to act on a company or feed it into find_people. Set fields="verbose" only when you specifically need the full firmographic record (funding history, technologies, keywords, NAICS codes, all socials, descriptions).';
7
7
  export const searchCompaniesSchema = {
8
8
  keywords: z.array(z.string()).optional().describe('Free-text topics, business models, or themes — e.g. ["SaaS", "fintech", "cybersecurity"]. Best for most discovery: matched broadly across company name, description, and tags. Prefer this over `industries` for terms like "SaaS" that are business models rather than formal industry categories.'),
9
+ similar_to_domains: z.array(z.string()).max(10).optional().describe('Seed company domains to find lookalikes of (up to 10) — e.g. ["stripe.com", "lemlist.com"]. Routes to DiscoLike\'s lookalike discovery over 70M companies; the best way to build a net-new TAM from example accounts. Optionally narrow with keywords / industries / countries / employee range. Not compatible with tech-stack, funding, revenue, founded-year, or hiring/growth filters.'),
9
10
  countries: z.array(z.string()).optional().describe('2-letter ISO country codes (e.g. ["FR", "US"])'),
10
11
  locations: z.array(z.string()).optional().describe('City/region filters as free-text strings (e.g. ["Paris, France", "San Francisco, California"]). Narrows results beyond country-level.'),
11
12
  industries: z.array(z.string()).optional().describe('Formal industry-taxonomy categories — e.g. ["Financial Services", "Hospitals and Health Care"]. Use only for strict industry classification; for business models or themes like "SaaS" or "fintech", use `keywords` instead. Both fields are searched together when set.'),
@@ -1 +1 @@
1
- {"version":3,"file":"search-companies.js","sourceRoot":"","sources":["../../src/tools/search-companies.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search-companies.js","sourceRoot":"","sources":["../../src/tools/search-companies.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"verify-emails-bulk.d.ts","sourceRoot":"","sources":["../../src/tools/verify-emails-bulk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,oBAAoB,uBAAuB,CAAA;AAExD,eAAO,MAAM,2BAA2B,QAIQ,CAAA;AAEhD,eAAO,MAAM,sBAAsB;;;CAGlC,CAAA;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAG3E"}
1
+ {"version":3,"file":"verify-emails-bulk.d.ts","sourceRoot":"","sources":["../../src/tools/verify-emails-bulk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,oBAAoB,uBAAuB,CAAA;AAExD,eAAO,MAAM,2BAA2B,QASQ,CAAA;AAEhD,eAAO,MAAM,sBAAsB;;;CAGlC,CAAA;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAG3E"}
@@ -4,6 +4,11 @@ export const verifyEmailsBulkName = 'verify_emails_bulk';
4
4
  export const verifyEmailsBulkDescription = 'Verify up to 5,000 emails in one ASYNC job. Returns a job_id immediately — this does NOT return verdicts inline. ' +
5
5
  'Poll get_bulk_job(job_id) until status is "done" (usually minutes), then read the per-verdict summary counts and page through rows. ' +
6
6
  'Charged only per conclusively-verified email (deliverable/catch-all addresses are sendable; unverifiable rows are free). ' +
7
+ 'IMPORTANT: an "unknown" verdict is NOT always "genuinely unverifiable". Use the response `coverage` block ' +
8
+ '{conclusive, skipped, unverifiable, pending} and each row\'s `result.reason`: a reason of chunk_failed/not_returned/timed_out ' +
9
+ 'means the address was SKIPPED (rate-limited / never checked) and is safe to re-submit — do not discard those contacts; ' +
10
+ 'only `provider_indeterminate` (or no reason) is a real "couldn\'t determine". ' +
11
+ 'The 202 response includes `credits_reserved` (worst-case hold, settled to actual on completion) and a `low_balance_warning` when low. ' +
7
12
  'For a single email use verify_email instead.';
8
13
  export const verifyEmailsBulkSchema = {
9
14
  emails: z.array(z.string()).min(1).max(5000).describe('Emails to verify (1–5000). Invalid/duplicate entries are dropped server-side.'),
@@ -1 +1 @@
1
- {"version":3,"file":"verify-emails-bulk.js","sourceRoot":"","sources":["../../src/tools/verify-emails-bulk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,CAAA;AAExD,MAAM,CAAC,MAAM,2BAA2B,GACtC,mHAAmH;IACnH,sIAAsI;IACtI,2HAA2H;IAC3H,8CAA8C,CAAA;AAEhD,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,+EAA+E,CAAC;IACtI,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;CACjG,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAA8B;IAC1E,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,2BAA2B,EAAE,KAAK,CAAC,CAAA;IACrE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAA;AACnG,CAAC"}
1
+ {"version":3,"file":"verify-emails-bulk.js","sourceRoot":"","sources":["../../src/tools/verify-emails-bulk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,CAAA;AAExD,MAAM,CAAC,MAAM,2BAA2B,GACtC,mHAAmH;IACnH,sIAAsI;IACtI,2HAA2H;IAC3H,4GAA4G;IAC5G,gIAAgI;IAChI,yHAAyH;IACzH,gFAAgF;IAChF,wIAAwI;IACxI,8CAA8C,CAAA;AAEhD,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,+EAA+E,CAAC;IACtI,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;CACjG,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAA8B;IAC1E,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,2BAA2B,EAAE,KAAK,CAAC,CAAA;IACrE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAA;AACnG,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coldiq/mcp",
3
- "version": "0.3.25",
3
+ "version": "0.3.30",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
package/src/registry.ts CHANGED
@@ -1061,6 +1061,48 @@ const searchCompaniesProviders: ProviderEntry[] = [
1061
1061
  return isNonEmptyArray(d.content)
1062
1062
  },
1063
1063
  },
1064
+ {
1065
+ // Tail fallback — semantic/ICP-text discovery (11 credits/query + 0.21/result).
1066
+ id: 'discolike',
1067
+ endpoint: '/discolike/discover',
1068
+ method: 'GET',
1069
+ priority: 19,
1070
+ isApplicable: (input) => {
1071
+ if (!isNonEmptyArray(input.similar_to_domains) && !isNonEmptyArray(input.keywords) && !isNonEmptyArray(input.industries)) return false
1072
+ if (isNonEmptyArray(input.locations)) return false
1073
+ if (input.linkedin_search_url) return false
1074
+ if (isNonEmptyArray(input.technologies)) return false
1075
+ if (isNonEmptyArray(input.funding_stages)) return false
1076
+ if (input.min_funding_amount !== undefined || input.max_funding_amount !== undefined) return false
1077
+ if (input.min_funding_year !== undefined || input.max_funding_year !== undefined) return false
1078
+ if (input.min_revenue !== undefined || input.max_revenue !== undefined) return false
1079
+ if (input.min_founded_year !== undefined || input.max_founded_year !== undefined) return false
1080
+ if (isNonEmptyArray(input.exclude_industries) || isNonEmptyArray(input.exclude_countries)) return false
1081
+ if (typeof input.min_workforce_growth_pct === 'number' || input.is_hiring === true) return false
1082
+ return true
1083
+ },
1084
+ mapParams: (input) => {
1085
+ const icpParts = [
1086
+ ...((input.keywords as string[] | undefined) ?? []),
1087
+ ...((input.industries as string[] | undefined) ?? []),
1088
+ ]
1089
+ const limit = (input.limit as number | undefined) ?? 25
1090
+ return {
1091
+ queryParams: {
1092
+ // Seed domains drive lookalike discovery; icp_text narrows semantically.
1093
+ ...(isNonEmptyArray(input.similar_to_domains) ? { domain: (input.similar_to_domains as string[]).join(',') } : {}),
1094
+ ...(icpParts.length > 0 ? { icp_text: icpParts.join(' ') } : {}),
1095
+ ...(isNonEmptyArray(input.countries) ? { country: (input.countries as string[]).join(',') } : {}),
1096
+ ...(input.min_employees !== undefined || input.max_employees !== undefined
1097
+ ? { employee_range: `${(input.min_employees as number) ?? 1},${(input.max_employees as number) ?? 1000000}` }
1098
+ : {}),
1099
+ ...(isNonEmptyArray(input.exclude_domains) ? { exclude_domain: (input.exclude_domains as string[]).join(',') } : {}),
1100
+ max_records: String(Math.min(Math.max(limit, 5), 1000)),
1101
+ },
1102
+ }
1103
+ },
1104
+ hasResult: (data) => Array.isArray(data) && data.length > 0,
1105
+ },
1064
1106
  ]
1065
1107
 
1066
1108
  // ---------------------------------------------------------------------------
@@ -2074,6 +2116,19 @@ const enrichCompanyProviders: ProviderEntry[] = [
2074
2116
  mapParams: (input) => ({ body: { company_url: input.linkedin_url } }),
2075
2117
  hasResult: (data) => hasAnyKey(data, ['name', 'domain', 'website', 'company']),
2076
2118
  },
2119
+ {
2120
+ // Last-resort fallback (12 credits flat): SSL-derived firmographics.
2121
+ id: 'discolike',
2122
+ endpoint: '/discolike/bizdata',
2123
+ method: 'GET',
2124
+ priority: 15,
2125
+ isApplicable: (input) => !!input.domain,
2126
+ mapParams: (input) => ({ queryParams: { domain: input.domain as string } }),
2127
+ hasResult: (data) => {
2128
+ const d = data as Record<string, unknown>
2129
+ return typeof d?.name === 'string' && d.name.length > 0
2130
+ },
2131
+ },
2077
2132
  ]
2078
2133
 
2079
2134
  // ---------------------------------------------------------------------------
@@ -8,7 +8,10 @@ export const enrichPersonDescription =
8
8
  "Look up a person's LinkedIn profile and professional details. " +
9
9
  'Accepts either an email address (reverse lookup) or name + company (profile enrichment). ' +
10
10
  'Returns LinkedIn URL, headline, location, current role, and profile data. ' +
11
- 'ColdIQ automatically picks the best provider based on which input fields are present — pass use_providers only if you need a specific tool.'
11
+ 'ColdIQ automatically picks the best provider based on which input fields are present — pass use_providers only if you need a specific tool. ' +
12
+ 'CHECK the response `_meta` before trusting a reverse-email match: `_meta.match_confidence` (0–1, when the provider gives a score) ' +
13
+ 'and `_meta.input_match` (true = the record carries the exact queried email; false = the person\'s email is on a DIFFERENT domain, a strong ' +
14
+ 'wrong-person signal; absent = same domain but a different mailbox, or no email to confirm against). A low/false signal means verify the identity before using it.'
12
15
 
13
16
  export const enrichPersonSchema = {
14
17
  email: z.string().email().optional().describe('Email address for reverse lookup — identify the person behind the email'),
@@ -7,7 +7,11 @@ export const findEmailsBulkDescription =
7
7
  'Find professional emails for up to 5,000 people in one ASYNC job. Returns a job_id immediately — this does NOT return emails inline. ' +
8
8
  'Poll get_bulk_job(job_id) until status is "done" (usually minutes), then read the found/not_found summary and page through rows. ' +
9
9
  'Each person should have first_name + last_name + domain (people missing those come back as not_found and are not charged). ' +
10
- 'Charged only per found email. For 50 or fewer people that you want back inline, use find_emails instead.'
10
+ 'Charged only per found email. A "found" row means an email was LOCATED, not verified deliverable: each row\'s ' +
11
+ 'result carries a `confidence` (high/medium/low/unknown) — treat medium/low/unknown as unverified guesses and run ' +
12
+ 'verify_emails_bulk before sending, or you risk bounces. The 202 response includes `credits_reserved` (worst-case hold, ' +
13
+ 'settled to actual on completion) and a `low_balance_warning` when your balance is running low. For 50 or fewer people that ' +
14
+ 'you want back inline, use find_emails instead.'
11
15
 
12
16
  export const findEmailsBulkSchema = {
13
17
  people: z
@@ -11,7 +11,10 @@ export const findEmailsDescription =
11
11
  'Each person needs a unique id to match results back. ' +
12
12
  'Always pass first_name, last_name, and domain — they are the primary enrichment signal. ' +
13
13
  'Also pass linkedin_url when available, but never rely on it alone as some providers cannot resolve vanity URLs. ' +
14
- 'ColdIQ automatically picks the best waterfall — pass use_providers only if you need specific tools.'
14
+ 'ColdIQ automatically picks the best waterfall — pass use_providers only if you need specific tools. ' +
15
+ 'A returned email means one was LOCATED, not verified deliverable: each result carries a `confidence` ' +
16
+ '(high/medium/low/unknown) — treat medium/low/unknown as unverified guesses and run verify_email / ' +
17
+ 'verify_emails_bulk before sending, or you risk bounces.'
15
18
 
16
19
  export const findEmailsSchema = {
17
20
  people: z
@@ -7,6 +7,7 @@ export const findPeopleName = 'find_people'
7
7
  export const findPeopleDescription =
8
8
  'Find people at specific companies by job title. ' +
9
9
  'CRITICAL: pass ALL companies in ONE call — never loop one call per company. Each call runs a ~90s async job, so looping N companies costs ~N×90s while one batched call stays ~90s total for the same data. ' +
10
+ 'PRACTICAL LIMIT: the search fans out one sub-job per company under a ~85s edge budget, so ≈2–3 companies complete per call; with more companies the call may return PARTIAL results — check `_meta.partial` / `_meta.companies_complete` / `_meta.companies_total` and re-run the unfinished companies in a follow-up call. For large multi-company lists, split into batches of ~2–3 companies. ' +
10
11
  'Set limit = (desired results per company) × (number of companies). ' +
11
12
  'Use this — never search_web — to find contacts, executives, or LinkedIn profiles at known companies. ' +
12
13
  'Do not fall back to search_web when results look uncertain or LinkedIn URLs seem wrong — trust what this tool returns. ' +
@@ -5,10 +5,13 @@ export const getBulkJobName = 'get_bulk_job'
5
5
 
6
6
  export const getBulkJobDescription =
7
7
  'Poll any async bulk job (verify_emails_bulk, find_emails_bulk, enrich_person_bulk, enrich_company_bulk, find_phone_bulk). ' +
8
- 'Returns { status, items_total, items_processed, summary, page }. Poll until status is "done" (or "timed_out"). Use the `summary` ' +
9
- 'per-verdict counts for totals — do NOT expect all rows inline: rows come one page at a time (default 100). Each row echoes its ' +
10
- 'submitted `input`, so you can map verdicts back to your submissions without tracking order. To page, OMIT cursor for the first page, ' +
11
- 'then call again with cursor = page.next_cursor until next_cursor is null.'
8
+ 'Returns { status, items_total, items_processed, summary, coverage, credits_reserved, credits_charged, page }. Poll until status is "done" (or "timed_out"). ' +
9
+ 'Use the `summary` per-verdict counts for totals — do NOT expect all rows inline: rows come one page at a time (default 100). ' +
10
+ 'The `coverage` block {conclusive, skipped, unverifiable, failed, pending} tells you how much was truly resolved: `skipped` rows (per-row ' +
11
+ '`result.reason` chunk_failed/not_returned/timed_out) were never conclusively checked and are safe to re-submit; `failed` is a hard error (retry unlikely to help). ' +
12
+ '`credits_charged` (null until settled) is the actual spend; `credits_reserved` is the worst-case hold. Each row echoes its submitted `input`, ' +
13
+ 'so you can map verdicts back to your submissions without tracking order. To page, OMIT cursor for the first page, then call again with ' +
14
+ 'cursor = page.next_cursor until next_cursor is null.'
12
15
 
13
16
  export const getBulkJobSchema = {
14
17
  job_id: z.number().int().describe('The job_id returned by a *_bulk submit tool.'),
@@ -5,11 +5,12 @@ import { getProvidersForCapability } from '../utils/provider-resolver.js'
5
5
  export const searchCompaniesName = 'search_companies'
6
6
 
7
7
  export const searchCompaniesDescription =
8
- 'Search B2B companies by industry, size, geography, founding year, tech stack, funding, revenue, exclusion lists, and hiring signals. Routing is automatic: strict firmographic filters (revenue, employee bands, exclusion lists) get high-precision providers first; tech-stack and funding-stage filters route to specialized providers; loose keyword/geo searches fall back to broad providers; a LinkedIn Sales Navigator search URL enables URL-based discovery as a final fallback. For buying-intent topic discovery (find companies associated with intent keywords like "sales automation" or "lead generation"), pass `keywords` with `use_providers: ["theirstack"]` — this routes to TheirStack\'s intent-keyword index instead of the default full-text match. For "fast-growing" companies there is no exact workforce-growth % filter anywhere — pass min_workforce_growth_pct (and/or is_hiring / a recent-funding filter) and ColdIQ routes to active-hiring and recently-funded providers, the practical proxies for growth. ColdIQ automatically picks the best provider — pass use_providers only if you need a specific tool. Default limit: 25. ' +
8
+ 'Search B2B companies by industry, size, geography, founding year, tech stack, funding, revenue, exclusion lists, and hiring signals. To build a lookalike TAM from example accounts, pass `similar_to_domains` (seed company domains) — the request routes to DiscoLike\'s lookalike discovery over 70M companies, optionally narrowed by keywords/geo/size. Routing is otherwise automatic: strict firmographic filters (revenue, employee bands, exclusion lists) get high-precision providers first; tech-stack and funding-stage filters route to specialized providers; loose keyword/geo searches fall back to broad providers; a LinkedIn Sales Navigator search URL enables URL-based discovery as a final fallback. For buying-intent topic discovery (find companies associated with intent keywords like "sales automation" or "lead generation"), pass `keywords` with `use_providers: ["theirstack"]` — this routes to TheirStack\'s intent-keyword index instead of the default full-text match. For "fast-growing" companies there is no exact workforce-growth % filter anywhere — pass min_workforce_growth_pct (and/or is_hiring / a recent-funding filter) and ColdIQ routes to active-hiring and recently-funded providers, the practical proxies for growth. ColdIQ automatically picks the best provider — pass use_providers only if you need a specific tool. Default limit: 25. ' +
9
9
  'Response is compact by default (name, domain, website, linkedin_url, employees, revenue, industry, country, city, founded_year, categories) — everything needed to act on a company or feed it into find_people. Set fields="verbose" only when you specifically need the full firmographic record (funding history, technologies, keywords, NAICS codes, all socials, descriptions).'
10
10
 
11
11
  export const searchCompaniesSchema = {
12
12
  keywords: z.array(z.string()).optional().describe('Free-text topics, business models, or themes — e.g. ["SaaS", "fintech", "cybersecurity"]. Best for most discovery: matched broadly across company name, description, and tags. Prefer this over `industries` for terms like "SaaS" that are business models rather than formal industry categories.'),
13
+ similar_to_domains: z.array(z.string()).max(10).optional().describe('Seed company domains to find lookalikes of (up to 10) — e.g. ["stripe.com", "lemlist.com"]. Routes to DiscoLike\'s lookalike discovery over 70M companies; the best way to build a net-new TAM from example accounts. Optionally narrow with keywords / industries / countries / employee range. Not compatible with tech-stack, funding, revenue, founded-year, or hiring/growth filters.'),
13
14
  countries: z.array(z.string()).optional().describe('2-letter ISO country codes (e.g. ["FR", "US"])'),
14
15
  locations: z.array(z.string()).optional().describe('City/region filters as free-text strings (e.g. ["Paris, France", "San Francisco, California"]). Narrows results beyond country-level.'),
15
16
  industries: z.array(z.string()).optional().describe('Formal industry-taxonomy categories — e.g. ["Financial Services", "Hospitals and Health Care"]. Use only for strict industry classification; for business models or themes like "SaaS" or "fintech", use `keywords` instead. Both fields are searched together when set.'),
@@ -7,6 +7,11 @@ export const verifyEmailsBulkDescription =
7
7
  'Verify up to 5,000 emails in one ASYNC job. Returns a job_id immediately — this does NOT return verdicts inline. ' +
8
8
  'Poll get_bulk_job(job_id) until status is "done" (usually minutes), then read the per-verdict summary counts and page through rows. ' +
9
9
  'Charged only per conclusively-verified email (deliverable/catch-all addresses are sendable; unverifiable rows are free). ' +
10
+ 'IMPORTANT: an "unknown" verdict is NOT always "genuinely unverifiable". Use the response `coverage` block ' +
11
+ '{conclusive, skipped, unverifiable, pending} and each row\'s `result.reason`: a reason of chunk_failed/not_returned/timed_out ' +
12
+ 'means the address was SKIPPED (rate-limited / never checked) and is safe to re-submit — do not discard those contacts; ' +
13
+ 'only `provider_indeterminate` (or no reason) is a real "couldn\'t determine". ' +
14
+ 'The 202 response includes `credits_reserved` (worst-case hold, settled to actual on completion) and a `low_balance_warning` when low. ' +
10
15
  'For a single email use verify_email instead.'
11
16
 
12
17
  export const verifyEmailsBulkSchema = {
@@ -391,8 +391,9 @@ describe('search_companies priority ordering', () => {
391
391
  }
392
392
  })
393
393
 
394
- it('ai-ark-companies is last (priority 18)', () => {
394
+ it('discolike is last (priority 19), after ai-ark-companies (18)', () => {
395
395
  const ps = providers()
396
- expect(ps[ps.length - 1].id).toBe('ai-ark-companies')
396
+ expect(ps[ps.length - 1].id).toBe('discolike')
397
+ expect(ps[ps.length - 2].id).toBe('ai-ark-companies')
397
398
  })
398
399
  })
@@ -459,7 +459,7 @@ describe('registry', () => {
459
459
  expect(ld.isApplicable!({ linkedin_search_url: 'https://...' })).toBe(true)
460
460
  })
461
461
 
462
- it('search_companies has 17 providers in priority order', () => {
462
+ it('search_companies has 18 providers in priority order', () => {
463
463
  const providers = getProviders('search_companies')
464
464
  expect(providers.map((p) => p.id)).toEqual([
465
465
  'companyenrich',
@@ -479,6 +479,7 @@ describe('registry', () => {
479
479
  'linkupapi-hiring',
480
480
  'prospeo-search-company',
481
481
  'ai-ark-companies',
482
+ 'discolike',
482
483
  ])
483
484
  })
484
485
 
@@ -833,12 +834,12 @@ describe('registry', () => {
833
834
  })
834
835
 
835
836
  describe('enrich_company', () => {
836
- it('providers are ordered companyenrich → pdl → apollo → limadata → prospeo → companyenrich_props → blitzapi → wiza → findymail → icypeas → builtwith → openmart → linkupapi-by-domain → linkupapi-by-url', () => {
837
+ it('providers are ordered companyenrich → pdl → apollo → limadata → prospeo → companyenrich_props → blitzapi → wiza → findymail → icypeas → builtwith → openmart → linkupapi-by-domain → linkupapi-by-url → discolike', () => {
837
838
  const ids = getProviders('enrich_company').map((p) => p.id)
838
839
  expect(ids).toEqual([
839
840
  'companyenrich', 'pdl', 'apollo', 'limadata', 'prospeo',
840
841
  'companyenrich_props', 'blitzapi', 'wiza', 'findymail', 'icypeas',
841
- 'builtwith', 'openmart', 'linkupapi-by-domain', 'linkupapi-by-url',
842
+ 'builtwith', 'openmart', 'linkupapi-by-domain', 'linkupapi-by-url', 'discolike',
842
843
  ])
843
844
  })
844
845