@coldiq/mcp 0.3.19 → 0.3.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -8,6 +8,9 @@ import { findEmailName, findEmailDescription, findEmailSchema, findEmailHandler,
8
8
  import { enrichPersonName, enrichPersonDescription, enrichPersonSchema, enrichPersonHandler, } from './tools/enrich-person.js';
9
9
  import { findEmailsName, findEmailsDescription, findEmailsSchema, findEmailsHandler, } from './tools/find-emails.js';
10
10
  import { verifyEmailName, verifyEmailDescription, verifyEmailSchema, verifyEmailHandler, } from './tools/verify-email.js';
11
+ import { verifyEmailsBulkName, verifyEmailsBulkDescription, verifyEmailsBulkSchema, verifyEmailsBulkHandler } from './tools/verify-emails-bulk.js';
12
+ import { findEmailsBulkName, findEmailsBulkDescription, findEmailsBulkSchema, findEmailsBulkHandler } from './tools/find-emails-bulk.js';
13
+ import { getBulkJobName, getBulkJobDescription, getBulkJobSchema, getBulkJobHandler } from './tools/get-bulk-job.js';
11
14
  import { findPhoneName, findPhoneDescription, findPhoneSchema, findPhoneHandler, } from './tools/find-phone.js';
12
15
  import { enrichCompanyName, enrichCompanyDescription, enrichCompanySchema, enrichCompanyHandler, } from './tools/enrich-company.js';
13
16
  import { searchWebName, searchWebDescription, searchWebSchema, searchWebHandler, } from './tools/search-web.js';
@@ -50,6 +53,9 @@ server.tool(findEmailName, findEmailDescription, findEmailSchema, findEmailHandl
50
53
  server.tool(enrichPersonName, enrichPersonDescription, enrichPersonSchema, enrichPersonHandler);
51
54
  server.tool(findEmailsName, findEmailsDescription, findEmailsSchema, findEmailsHandler);
52
55
  server.tool(verifyEmailName, verifyEmailDescription, verifyEmailSchema, verifyEmailHandler);
56
+ server.tool(verifyEmailsBulkName, verifyEmailsBulkDescription, verifyEmailsBulkSchema, verifyEmailsBulkHandler);
57
+ server.tool(findEmailsBulkName, findEmailsBulkDescription, findEmailsBulkSchema, findEmailsBulkHandler);
58
+ server.tool(getBulkJobName, getBulkJobDescription, getBulkJobSchema, getBulkJobHandler);
53
59
  server.tool(findPhoneName, findPhoneDescription, findPhoneSchema, findPhoneHandler);
54
60
  server.tool(enrichCompanyName, enrichCompanyDescription, enrichCompanySchema, enrichCompanyHandler);
55
61
  server.tool(searchWebName, searchWebDescription, searchWebSchema, searchWebHandler);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,yBAAyB,EACzB,gCAAgC,EAChC,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AAE9B,0CAA0C;AAC1C,UAAU,EAAE,CAAA;AAEZ,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;IACE,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,OAAO;CACjB,EACD;IACE,wEAAwE;IACxE,sEAAsE;IACtE,4EAA4E;IAC5E,0EAA0E;IAC1E,YAAY,EAAE;QACZ,0FAA0F;QAC1F,qPAAqP;QACrP,0LAA0L;QAC1L,sGAAsG;KACvG,CAAC,IAAI,CAAC,IAAI,CAAC;CACb,CACF,CAAA;AAED,qBAAqB;AACrB,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,sBAAsB,CAAC,CAAA;AAC3G,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAA;AACvF,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAA;AACnF,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAA;AAC/F,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAA;AACvF,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAA;AAC3F,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAA;AACnF,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,CAAA;AACnG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAA;AACnF,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAA;AACvF,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAA;AACnF,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAA;AAC/F,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,sBAAsB,CAAC,CAAA;AAC3G,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAA;AAC/F,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAA;AACnF,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAA;AAC3F,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,uBAAuB,CAAC,CAAA;AAC/G,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,uBAAuB,CAAC,CAAA;AAC/G,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,sBAAsB,CAAC,CAAA;AAC3G,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,sBAAsB,CAAC,CAAA;AAC3G,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAA;AACvF,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAA;AACnF,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,gCAAgC,EAAE,2BAA2B,EAAE,4BAA4B,CAAC,CAAA;AACnI,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,sBAAsB,CAAC,CAAA;AAE3G,8BAA8B;AAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;AAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { z } from 'zod';
2
+ export declare const findEmailsBulkName = "find_emails_bulk";
3
+ export declare const findEmailsBulkDescription: string;
4
+ export declare const findEmailsBulkSchema: {
5
+ people: z.ZodArray<z.ZodObject<{
6
+ id: z.ZodOptional<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 | undefined;
13
+ linkedin_url?: string | undefined;
14
+ domain?: string | undefined;
15
+ first_name?: string | undefined;
16
+ last_name?: string | undefined;
17
+ }, {
18
+ id?: string | undefined;
19
+ linkedin_url?: string | undefined;
20
+ domain?: string | undefined;
21
+ first_name?: string | undefined;
22
+ last_name?: string | undefined;
23
+ }>, "many">;
24
+ webhook_url: z.ZodOptional<z.ZodString>;
25
+ };
26
+ export declare function findEmailsBulkHandler(input: Record<string, unknown>): Promise<{
27
+ content: {
28
+ type: "text";
29
+ text: string;
30
+ }[];
31
+ isError: boolean;
32
+ }>;
33
+ //# sourceMappingURL=find-emails-bulk.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+ import { callApi } from '../client.js';
3
+ export const findEmailsBulkName = 'find_emails_bulk';
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
+ 'Poll get_bulk_job(job_id) until status is "done" (usually minutes), then read the found/not_found summary and page through rows. ' +
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.';
8
+ export const findEmailsBulkSchema = {
9
+ people: z
10
+ .array(z.object({
11
+ id: z.string().optional().describe('Your correlation id (results echo back by row order; an id is convenient but optional).'),
12
+ first_name: z.string().optional().describe('First name'),
13
+ last_name: z.string().optional().describe('Last name'),
14
+ domain: z.string().optional().describe('Company domain (e.g. "stripe.com")'),
15
+ linkedin_url: z.string().optional().describe('LinkedIn profile URL (optional)'),
16
+ }))
17
+ .min(1)
18
+ .max(5000)
19
+ .describe('People to find emails for (1–5000). Each needs first_name + last_name + domain to be searched.'),
20
+ webhook_url: z.string().optional().describe('Optional URL POSTed when the whole job completes.'),
21
+ };
22
+ export async function findEmailsBulkHandler(input) {
23
+ const res = await callApi('POST', '/email/find/bulk/submit', input);
24
+ return { content: [{ type: 'text', text: JSON.stringify(res.data) }], isError: !res.ok };
25
+ }
26
+ //# sourceMappingURL=find-emails-bulk.js.map
@@ -0,0 +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"}
@@ -25,10 +25,10 @@ export const findEmailsSchema = {
25
25
  };
26
26
  // Split large batches into sequential sub-batches so each HTTP call stays well
27
27
  // under the server's bulk wall-clock budget (and thus Cloudflare's ~100s edge
28
- // cutoff). A single 50-contact call could run long enough to be reset ("Network
29
- // error", WF2); two ~25-contact calls each return quickly. Matches the server's
30
- // bulk concurrency cap so each chunk is a single server wave.
31
- const FIND_EMAILS_CHUNK_SIZE = 25;
28
+ // cutoff). Field feedback measured batches of 25 collapsing to ~10–16% success
29
+ // under upstream concurrency, while batches of 10 land 80–90% so chunk at 10.
30
+ // For lists beyond ~50, use the async find_emails_bulk tool (handles up to 5,000).
31
+ const FIND_EMAILS_CHUNK_SIZE = 10;
32
32
  function toolResult(payload, isError) {
33
33
  return { content: [{ type: 'text', text: JSON.stringify(payload) }], isError };
34
34
  }
@@ -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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAErE,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAA;AAE3C,MAAM,CAAC,MAAM,qBAAqB,GAChC,6DAA6D;IAC7D,mEAAmE;IACnE,0EAA0E;IAC1E,uDAAuD;IACvD,0FAA0F;IAC1F,kHAAkH;IAClH,qGAAqG,CAAA;AAEvG,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM,EAAE,CAAC;SACN,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wEAAwE,CAAC;QACjG,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,+EAA+E,CAAC;KAC9H,CAAC,CACH;SACA,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,CAAC,oCAAoC,CAAC;IACjD,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oKAAoK,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,qEAAqE,CAAC;CAClU,CAAA;AAED,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,gFAAgF;AAChF,mFAAmF;AACnF,MAAM,sBAAsB,GAAG,EAAE,CAAA;AAIjC,SAAS,UAAU,CAAC,OAAgB,EAAE,OAAgB;IACpD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAA;AAChF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA8B;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,MAAoB,CAAC,CAAC,CAAC,EAAE,CAAA;IAE7E,iFAAiF;IACjF,+EAA+E;IAC/E,IAAI,MAAM,CAAC,MAAM,IAAI,sBAAsB,EAAE,CAAC;QAC5C,OAAO,QAAQ,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,CAAwB,CAAA;IAC9G,CAAC;IAED,+EAA+E;IAC/E,MAAM,MAAM,GAAc,EAAE,CAAA;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,sBAAsB,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,sBAAsB,CAAC,CAAA;QACzD,MAAM,GAAG,GAAG,CAAC,MAAM,QAAQ,CACzB,aAAa,EACb,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAC3B,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,CAC/C,CAAe,CAAA;QAEhB,IAAI,IAAa,CAAA;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,GAAG,SAAS,CAAA;QAClB,CAAC;QACD,MAAM,OAAO,GAAI,IAA4C,EAAE,OAAO,CAAA;QAEtE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,6EAA6E;YAC7E,2EAA2E;YAC3E,8EAA8E;YAC9E,MAAM,SAAS,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAe,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAA;YAC/G,OAAO,UAAU,CAAC,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;QAC5D,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAA;QAEvB,+EAA+E;QAC/E,iDAAiD;QACjD,IAAI,GAAG,CAAC,OAAO;YAAE,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;IAC/D,CAAC;IAED,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,CAAA;AAC/C,CAAC"}
@@ -9,6 +9,7 @@ export declare const findPeopleSchema: {
9
9
  locations: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
10
10
  keywords: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
11
11
  limit: z.ZodDefault<z.ZodNumber>;
12
+ max_per_company: z.ZodOptional<z.ZodNumber>;
12
13
  fields: z.ZodDefault<z.ZodEnum<["compact", "verbose"]>>;
13
14
  reveal: z.ZodOptional<z.ZodBoolean>;
14
15
  use_providers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -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;;;;;;;;;;;CAW5B,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,QAWiJ,CAAA;AAEnL,eAAO,MAAM,gBAAgB;;;;;;;;;;;;CAY5B,CAAA;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAErE"}
@@ -21,6 +21,7 @@ export const findPeopleSchema = {
21
21
  locations: z.array(z.string()).optional().describe('Person locations as either ISO-2 country codes ("BR") or English country names ("Brazil") — both are accepted and normalized internally. LeadsFactory uses these to scope contacts to the country; other providers fall back to free-text matching.'),
22
22
  keywords: z.array(z.string()).optional().describe('Free-text keyword search terms (e.g. ["growth", "AI"])'),
23
23
  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. Note: when the matched provider is Apollo, results are capped at 100 per call (Apollo upstream limit).'),
24
+ max_per_company: z.number().min(1).optional().describe('Cap the number of contacts returned per company (e.g. 3 for a buying committee). Applied across all matched companies, before the global limit.'),
24
25
  fields: z.enum(['compact', 'verbose']).default('compact').describe('Response shape. "compact" (default) returns a small, predictable per-person record: name, title, linkedin_url, company {name, domain, linkedin_url, headcount}, plus seniority/email/location when the upstream provider includes them. "verbose" returns the raw provider passthrough (~30KB+ per record from FullEnrich: employment history, every company office, descriptions, skills, languages) — only use when you specifically need those fields.'),
25
26
  reveal: z.boolean().optional().describe('Apollo-only: when true, follow the obfuscated Apollo people-search results with /apollo/people/bulk-match to reveal full names, emails, and LinkedIn URLs. Costs 1 extra credit per revealed person on top of the search credit. Has no effect for other providers (their data is already unobfuscated). Default false to protect credits.'),
26
27
  use_providers: z.array(z.string()).optional().describe(`Optional ordered list of providers to use. Leave empty to let ColdIQ automatically pick the best tool for your inputs — recommended for most use cases. Available providers: ${getProvidersForCapability('find_people').join(', ')}. Provider names are matched fuzzily, so minor typos are tolerated.`),
@@ -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,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,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"}
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ export declare const getBulkJobName = "get_bulk_job";
3
+ export declare const getBulkJobDescription: string;
4
+ export declare const getBulkJobSchema: {
5
+ job_id: z.ZodNumber;
6
+ cursor: z.ZodOptional<z.ZodNumber>;
7
+ limit: z.ZodOptional<z.ZodNumber>;
8
+ };
9
+ export declare function getBulkJobHandler(input: Record<string, unknown>): Promise<{
10
+ content: {
11
+ type: "text";
12
+ text: string;
13
+ }[];
14
+ isError: boolean;
15
+ }>;
16
+ //# sourceMappingURL=get-bulk-job.d.ts.map
@@ -0,0 +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,QAG2F,CAAA;AAE7H,eAAO,MAAM,gBAAgB;;;;CAI5B,CAAA;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAIrE"}
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+ import { callApi } from '../client.js';
3
+ export const getBulkJobName = 'get_bulk_job';
4
+ export const getBulkJobDescription = 'Poll an async bulk job (from verify_emails_bulk or find_emails_bulk). Returns { status, items_total, items_processed, summary, page }. ' +
5
+ 'Poll until status is "done" (or "timed_out"). Use the `summary` per-verdict counts for totals — do NOT expect all rows inline: ' +
6
+ 'rows come one page at a time (default 100). To page, call again with cursor = page.next_cursor until next_cursor is null.';
7
+ export const getBulkJobSchema = {
8
+ job_id: z.number().int().describe('The job_id returned by verify_emails_bulk / find_emails_bulk.'),
9
+ cursor: z.number().int().optional().describe('Pagination cursor (row index) from the previous page.next_cursor.'),
10
+ limit: z.number().int().min(1).max(1000).optional().describe('Rows per page (default 100, max 1000).'),
11
+ };
12
+ export async function getBulkJobHandler(input) {
13
+ const { job_id, ...body } = input;
14
+ const res = await callApi('POST', `/jobs/${job_id}/results`, body);
15
+ return { content: [{ type: 'text', text: JSON.stringify(res.data) }], isError: !res.ok };
16
+ }
17
+ //# sourceMappingURL=get-bulk-job.js.map
@@ -0,0 +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,yIAAyI;IACzI,iIAAiI;IACjI,2HAA2H,CAAA;AAE7H,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;IAClG,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;IACjH,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"}
@@ -0,0 +1,15 @@
1
+ import { z } from 'zod';
2
+ export declare const verifyEmailsBulkName = "verify_emails_bulk";
3
+ export declare const verifyEmailsBulkDescription: string;
4
+ export declare const verifyEmailsBulkSchema: {
5
+ emails: z.ZodArray<z.ZodString, "many">;
6
+ webhook_url: z.ZodOptional<z.ZodString>;
7
+ };
8
+ export declare function verifyEmailsBulkHandler(input: Record<string, unknown>): Promise<{
9
+ content: {
10
+ type: "text";
11
+ text: string;
12
+ }[];
13
+ isError: boolean;
14
+ }>;
15
+ //# sourceMappingURL=verify-emails-bulk.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ import { callApi } from '../client.js';
3
+ export const verifyEmailsBulkName = 'verify_emails_bulk';
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
+ 'Poll get_bulk_job(job_id) until status is "done" (usually minutes), then read the per-verdict summary counts and page through rows. ' +
6
+ 'Charged only per conclusively-verified email (deliverable/catch-all addresses are sendable; unverifiable rows are free). ' +
7
+ 'For a single email use verify_email instead.';
8
+ export const verifyEmailsBulkSchema = {
9
+ emails: z.array(z.string()).min(1).max(5000).describe('Emails to verify (1–5000). Invalid/duplicate entries are dropped server-side.'),
10
+ webhook_url: z.string().optional().describe('Optional URL POSTed when the whole job completes.'),
11
+ };
12
+ export async function verifyEmailsBulkHandler(input) {
13
+ const res = await callApi('POST', '/email/verify/bulk/submit', input);
14
+ return { content: [{ type: 'text', text: JSON.stringify(res.data) }], isError: !res.ok };
15
+ }
16
+ //# sourceMappingURL=verify-emails-bulk.js.map
@@ -0,0 +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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coldiq/mcp",
3
- "version": "0.3.19",
3
+ "version": "0.3.21",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
package/src/index.ts CHANGED
@@ -46,6 +46,10 @@ import {
46
46
  verifyEmailHandler,
47
47
  } from './tools/verify-email.js'
48
48
 
49
+ import { verifyEmailsBulkName, verifyEmailsBulkDescription, verifyEmailsBulkSchema, verifyEmailsBulkHandler } from './tools/verify-emails-bulk.js'
50
+ import { findEmailsBulkName, findEmailsBulkDescription, findEmailsBulkSchema, findEmailsBulkHandler } from './tools/find-emails-bulk.js'
51
+ import { getBulkJobName, getBulkJobDescription, getBulkJobSchema, getBulkJobHandler } from './tools/get-bulk-job.js'
52
+
49
53
  import {
50
54
  findPhoneName,
51
55
  findPhoneDescription,
@@ -201,6 +205,9 @@ server.tool(findEmailName, findEmailDescription, findEmailSchema, findEmailHandl
201
205
  server.tool(enrichPersonName, enrichPersonDescription, enrichPersonSchema, enrichPersonHandler)
202
206
  server.tool(findEmailsName, findEmailsDescription, findEmailsSchema, findEmailsHandler)
203
207
  server.tool(verifyEmailName, verifyEmailDescription, verifyEmailSchema, verifyEmailHandler)
208
+ server.tool(verifyEmailsBulkName, verifyEmailsBulkDescription, verifyEmailsBulkSchema, verifyEmailsBulkHandler)
209
+ server.tool(findEmailsBulkName, findEmailsBulkDescription, findEmailsBulkSchema, findEmailsBulkHandler)
210
+ server.tool(getBulkJobName, getBulkJobDescription, getBulkJobSchema, getBulkJobHandler)
204
211
  server.tool(findPhoneName, findPhoneDescription, findPhoneSchema, findPhoneHandler)
205
212
  server.tool(enrichCompanyName, enrichCompanyDescription, enrichCompanySchema, enrichCompanyHandler)
206
213
  server.tool(searchWebName, searchWebDescription, searchWebSchema, searchWebHandler)
@@ -0,0 +1,32 @@
1
+ import { z } from 'zod'
2
+ import { callApi } from '../client.js'
3
+
4
+ export const findEmailsBulkName = 'find_emails_bulk'
5
+
6
+ export const findEmailsBulkDescription =
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
+ 'Poll get_bulk_job(job_id) until status is "done" (usually minutes), then read the found/not_found summary and page through rows. ' +
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.'
11
+
12
+ export const findEmailsBulkSchema = {
13
+ people: z
14
+ .array(
15
+ z.object({
16
+ id: z.string().optional().describe('Your correlation id (results echo back by row order; an id is convenient but optional).'),
17
+ first_name: z.string().optional().describe('First name'),
18
+ last_name: z.string().optional().describe('Last name'),
19
+ domain: z.string().optional().describe('Company domain (e.g. "stripe.com")'),
20
+ linkedin_url: z.string().optional().describe('LinkedIn profile URL (optional)'),
21
+ }),
22
+ )
23
+ .min(1)
24
+ .max(5000)
25
+ .describe('People to find emails for (1–5000). Each needs first_name + last_name + domain to be searched.'),
26
+ webhook_url: z.string().optional().describe('Optional URL POSTed when the whole job completes.'),
27
+ }
28
+
29
+ export async function findEmailsBulkHandler(input: Record<string, unknown>) {
30
+ const res = await callApi('POST', '/email/find/bulk/submit', input)
31
+ return { content: [{ type: 'text' as const, text: JSON.stringify(res.data) }], isError: !res.ok }
32
+ }
@@ -32,10 +32,10 @@ export const findEmailsSchema = {
32
32
 
33
33
  // Split large batches into sequential sub-batches so each HTTP call stays well
34
34
  // under the server's bulk wall-clock budget (and thus Cloudflare's ~100s edge
35
- // cutoff). A single 50-contact call could run long enough to be reset ("Network
36
- // error", WF2); two ~25-contact calls each return quickly. Matches the server's
37
- // bulk concurrency cap so each chunk is a single server wave.
38
- const FIND_EMAILS_CHUNK_SIZE = 25
35
+ // cutoff). Field feedback measured batches of 25 collapsing to ~10–16% success
36
+ // under upstream concurrency, while batches of 10 land 80–90% so chunk at 10.
37
+ // For lists beyond ~50, use the async find_emails_bulk tool (handles up to 5,000).
38
+ const FIND_EMAILS_CHUNK_SIZE = 10
39
39
 
40
40
  type ToolResult = { content: [{ type: 'text'; text: string }]; isError?: boolean }
41
41
 
@@ -25,6 +25,7 @@ export const findPeopleSchema = {
25
25
  locations: z.array(z.string()).optional().describe('Person locations as either ISO-2 country codes ("BR") or English country names ("Brazil") — both are accepted and normalized internally. LeadsFactory uses these to scope contacts to the country; other providers fall back to free-text matching.'),
26
26
  keywords: z.array(z.string()).optional().describe('Free-text keyword search terms (e.g. ["growth", "AI"])'),
27
27
  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. Note: when the matched provider is Apollo, results are capped at 100 per call (Apollo upstream limit).'),
28
+ max_per_company: z.number().min(1).optional().describe('Cap the number of contacts returned per company (e.g. 3 for a buying committee). Applied across all matched companies, before the global limit.'),
28
29
  fields: z.enum(['compact', 'verbose']).default('compact').describe('Response shape. "compact" (default) returns a small, predictable per-person record: name, title, linkedin_url, company {name, domain, linkedin_url, headcount}, plus seniority/email/location when the upstream provider includes them. "verbose" returns the raw provider passthrough (~30KB+ per record from FullEnrich: employment history, every company office, descriptions, skills, languages) — only use when you specifically need those fields.'),
29
30
  reveal: z.boolean().optional().describe('Apollo-only: when true, follow the obfuscated Apollo people-search results with /apollo/people/bulk-match to reveal full names, emails, and LinkedIn URLs. Costs 1 extra credit per revealed person on top of the search credit. Has no effect for other providers (their data is already unobfuscated). Default false to protect credits.'),
30
31
  use_providers: z.array(z.string()).optional().describe(`Optional ordered list of providers to use. Leave empty to let ColdIQ automatically pick the best tool for your inputs — recommended for most use cases. Available providers: ${getProvidersForCapability('find_people').join(', ')}. Provider names are matched fuzzily, so minor typos are tolerated.`),
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod'
2
+ import { callApi } from '../client.js'
3
+
4
+ export const getBulkJobName = 'get_bulk_job'
5
+
6
+ export const getBulkJobDescription =
7
+ 'Poll an async bulk job (from verify_emails_bulk or find_emails_bulk). Returns { status, items_total, items_processed, summary, page }. ' +
8
+ 'Poll until status is "done" (or "timed_out"). Use the `summary` per-verdict counts for totals — do NOT expect all rows inline: ' +
9
+ 'rows come one page at a time (default 100). To page, call again with cursor = page.next_cursor until next_cursor is null.'
10
+
11
+ export const getBulkJobSchema = {
12
+ job_id: z.number().int().describe('The job_id returned by verify_emails_bulk / find_emails_bulk.'),
13
+ cursor: z.number().int().optional().describe('Pagination cursor (row index) from the previous page.next_cursor.'),
14
+ limit: z.number().int().min(1).max(1000).optional().describe('Rows per page (default 100, max 1000).'),
15
+ }
16
+
17
+ export async function getBulkJobHandler(input: Record<string, unknown>) {
18
+ const { job_id, ...body } = input
19
+ const res = await callApi('POST', `/jobs/${job_id}/results`, body)
20
+ return { content: [{ type: 'text' as const, text: JSON.stringify(res.data) }], isError: !res.ok }
21
+ }
@@ -0,0 +1,20 @@
1
+ import { z } from 'zod'
2
+ import { callApi } from '../client.js'
3
+
4
+ export const verifyEmailsBulkName = 'verify_emails_bulk'
5
+
6
+ export const verifyEmailsBulkDescription =
7
+ 'Verify up to 5,000 emails in one ASYNC job. Returns a job_id immediately — this does NOT return verdicts inline. ' +
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
+ 'Charged only per conclusively-verified email (deliverable/catch-all addresses are sendable; unverifiable rows are free). ' +
10
+ 'For a single email use verify_email instead.'
11
+
12
+ export const verifyEmailsBulkSchema = {
13
+ emails: z.array(z.string()).min(1).max(5000).describe('Emails to verify (1–5000). Invalid/duplicate entries are dropped server-side.'),
14
+ webhook_url: z.string().optional().describe('Optional URL POSTed when the whole job completes.'),
15
+ }
16
+
17
+ export async function verifyEmailsBulkHandler(input: Record<string, unknown>) {
18
+ const res = await callApi('POST', '/email/verify/bulk/submit', input)
19
+ return { content: [{ type: 'text' as const, text: JSON.stringify(res.data) }], isError: !res.ok }
20
+ }
@@ -0,0 +1,48 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest'
2
+
3
+ const callApiMock = vi.fn()
4
+ vi.mock('../src/client.js', () => ({
5
+ callApi: (...args: unknown[]) => callApiMock(...args),
6
+ }))
7
+
8
+ import { verifyEmailsBulkHandler } from '../src/tools/verify-emails-bulk.js'
9
+ import { findEmailsBulkHandler } from '../src/tools/find-emails-bulk.js'
10
+ import { getBulkJobHandler } from '../src/tools/get-bulk-job.js'
11
+
12
+ beforeEach(() => {
13
+ callApiMock.mockReset()
14
+ callApiMock.mockResolvedValue({ ok: true, status: 202, data: { job_id: 7, status: 'processing', items_total: 2 }, headers: {} })
15
+ })
16
+
17
+ describe('bulk MCP tools', () => {
18
+ it('verify_emails_bulk POSTs the RAW body (not a verb envelope) to the submit path', async () => {
19
+ const res = await verifyEmailsBulkHandler({ emails: ['a@x.com', 'b@x.com'] })
20
+ const [method, path, body] = callApiMock.mock.calls[0]
21
+ expect(method).toBe('POST')
22
+ expect(path).toBe('/email/verify/bulk/submit')
23
+ expect(body).toEqual({ emails: ['a@x.com', 'b@x.com'] }) // no { input: ... } wrapping
24
+ expect(res.isError).toBe(false)
25
+ expect(JSON.parse(res.content[0].text)).toEqual({ job_id: 7, status: 'processing', items_total: 2 })
26
+ })
27
+
28
+ it('find_emails_bulk POSTs the raw people body to the find submit path', async () => {
29
+ await findEmailsBulkHandler({ people: [{ id: 'm', first_name: 'Michel', last_name: 'Lieben', domain: 'coldiq.com' }] })
30
+ const [, path, body] = callApiMock.mock.calls[0]
31
+ expect(path).toBe('/email/find/bulk/submit')
32
+ expect(body).toEqual({ people: [{ id: 'm', first_name: 'Michel', last_name: 'Lieben', domain: 'coldiq.com' }] })
33
+ })
34
+
35
+ it('get_bulk_job puts job_id in the path and pagination in the body', async () => {
36
+ callApiMock.mockResolvedValue({ ok: true, status: 200, data: { status: 'done' }, headers: {} })
37
+ await getBulkJobHandler({ job_id: 42, cursor: 100, limit: 200 })
38
+ const [, path, body] = callApiMock.mock.calls[0]
39
+ expect(path).toBe('/jobs/42/results')
40
+ expect(body).toEqual({ cursor: 100, limit: 200 }) // job_id stripped into the path
41
+ })
42
+
43
+ it('surfaces isError when the submit fails', async () => {
44
+ callApiMock.mockResolvedValue({ ok: false, status: 402, data: { error: 'Insufficient credits' }, headers: {} })
45
+ const res = await verifyEmailsBulkHandler({ emails: ['a@x.com'] })
46
+ expect(res.isError).toBe(true)
47
+ })
48
+ })
@@ -0,0 +1,18 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { z } from 'zod'
3
+ import { findPeopleSchema } from '../src/tools/find-people.js'
4
+
5
+ describe('find_people MCP tool schema', () => {
6
+ it('exposes max_per_company so the cap reaches the server (was silently dropped)', () => {
7
+ // Live matrix bug: the server verb honors max_per_company (D3), but the MCP tool
8
+ // schema didn't expose it, so Zod stripped it and the cap never applied (a
9
+ // multi-company search returned 5 notion contacts for max_per_company:3).
10
+ expect(Object.keys(findPeopleSchema)).toContain('max_per_company')
11
+ const parsed = z.object(findPeopleSchema).parse({
12
+ company_domains: ['figma.com', 'notion.so'],
13
+ job_titles: ['Account Executive'],
14
+ max_per_company: 3,
15
+ })
16
+ expect(parsed.max_per_company).toBe(3)
17
+ })
18
+ })
@@ -27,30 +27,30 @@ beforeEach(() => {
27
27
  })
28
28
 
29
29
  describe('find_emails auto-chunking', () => {
30
- it('≤25 people → a single passthrough call', async () => {
31
- await findEmailsHandler({ people: peopleOf(25) })
30
+ it('≤10 people → a single passthrough call', async () => {
31
+ await findEmailsHandler({ people: peopleOf(10) })
32
32
  expect(callVerbMock).toHaveBeenCalledTimes(1)
33
- expect((callVerbMock.mock.calls[0][1] as { people: Person[] }).people).toHaveLength(25)
33
+ expect((callVerbMock.mock.calls[0][1] as { people: Person[] }).people).toHaveLength(10)
34
34
  })
35
35
 
36
- it('>25 people → sequential chunks of ≤25, merged in order', async () => {
37
- const res = await findEmailsHandler({ people: peopleOf(60) })
36
+ it('>10 people → sequential chunks of ≤10, merged in order', async () => {
37
+ const res = await findEmailsHandler({ people: peopleOf(25) })
38
38
 
39
- // 6025 + 25 + 10
39
+ // 2510 + 10 + 5
40
40
  expect(callVerbMock).toHaveBeenCalledTimes(3)
41
- expect((callVerbMock.mock.calls[0][1] as { people: Person[] }).people).toHaveLength(25)
42
- expect((callVerbMock.mock.calls[1][1] as { people: Person[] }).people).toHaveLength(25)
43
- expect((callVerbMock.mock.calls[2][1] as { people: Person[] }).people).toHaveLength(10)
41
+ expect((callVerbMock.mock.calls[0][1] as { people: Person[] }).people).toHaveLength(10)
42
+ expect((callVerbMock.mock.calls[1][1] as { people: Person[] }).people).toHaveLength(10)
43
+ expect((callVerbMock.mock.calls[2][1] as { people: Person[] }).people).toHaveLength(5)
44
44
 
45
45
  const data = JSON.parse(res.content[0].text)
46
- expect(data.results).toHaveLength(60)
46
+ expect(data.results).toHaveLength(25)
47
47
  // Order preserved across chunks.
48
- expect(data.results.map((r: { id: string }) => r.id)).toEqual(peopleOf(60).map((p) => p.id))
48
+ expect(data.results.map((r: { id: string }) => r.id)).toEqual(peopleOf(25).map((p) => p.id))
49
49
  expect(res.isError).toBe(false)
50
50
  })
51
51
 
52
52
  it('forwards use_providers to every chunk', async () => {
53
- await findEmailsHandler({ people: peopleOf(30), use_providers: ['limadata-work-email'] })
53
+ await findEmailsHandler({ people: peopleOf(20), use_providers: ['limadata-work-email'] })
54
54
  expect(callVerbMock).toHaveBeenCalledTimes(2)
55
55
  for (const call of callVerbMock.mock.calls) {
56
56
  expect((call[1] as { use_providers: string[] }).use_providers).toEqual(['limadata-work-email'])
@@ -63,10 +63,10 @@ describe('find_emails auto-chunking', () => {
63
63
  .mockImplementationOnce((_p: string, input: Record<string, unknown>) => Promise.resolve(chunkResult(input, { isError: true })))
64
64
  const res = await findEmailsHandler({ people: peopleOf(60) })
65
65
 
66
- // 1st chunk ok, 2nd is a terminal error stop (3rd chunk never sent).
66
+ // 1st chunk ok (10), 2nd chunk's partial results are merged then we stop on its error.
67
67
  expect(callVerbMock).toHaveBeenCalledTimes(2)
68
68
  expect(res.isError).toBe(true)
69
69
  const data = JSON.parse(res.content[0].text)
70
- expect(data.results).toHaveLength(50) // partial results preserved
70
+ expect(data.results).toHaveLength(20) // chunk1 (10) + chunk2 (10), remaining chunks never sent
71
71
  })
72
72
  })