@coldiq/mcp 5.4.4 → 5.4.5
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/tool-json-schema.d.ts +8 -0
- package/dist/tool-json-schema.d.ts.map +1 -0
- package/dist/tool-json-schema.js +19 -0
- package/dist/tool-json-schema.js.map +1 -0
- package/dist/tools/call-endpoint.d.ts +7 -1
- package/dist/tools/call-endpoint.d.ts.map +1 -1
- package/dist/tools/call-endpoint.js +1 -1
- package/dist/tools/call-endpoint.js.map +1 -1
- package/dist/tools/enrich-company-bulk.d.ts +1 -9
- package/dist/tools/enrich-company-bulk.d.ts.map +1 -1
- package/dist/tools/enrich-company.d.ts +1 -1
- package/dist/tools/enrich-person-bulk.d.ts +1 -15
- package/dist/tools/enrich-person-bulk.d.ts.map +1 -1
- package/dist/tools/enrich-person.d.ts +1 -1
- package/dist/tools/extract-post-engagement.d.ts +5 -1
- package/dist/tools/extract-post-engagement.d.ts.map +1 -1
- package/dist/tools/fetch-page-content.d.ts +2 -2
- package/dist/tools/find-email.d.ts +1 -1
- package/dist/tools/find-emails-bulk.d.ts +1 -15
- package/dist/tools/find-emails-bulk.d.ts.map +1 -1
- package/dist/tools/find-emails.d.ts +2 -14
- package/dist/tools/find-emails.d.ts.map +1 -1
- package/dist/tools/find-influencers.d.ts +28 -8
- package/dist/tools/find-influencers.d.ts.map +1 -1
- package/dist/tools/find-influencers.js +1 -1
- package/dist/tools/find-influencers.js.map +1 -1
- package/dist/tools/find-people.d.ts +11 -8
- package/dist/tools/find-people.d.ts.map +1 -1
- package/dist/tools/find-phone-bulk.d.ts +1 -13
- package/dist/tools/find-phone-bulk.d.ts.map +1 -1
- package/dist/tools/find-phone.d.ts +1 -1
- package/dist/tools/find-signals.d.ts +16 -8
- package/dist/tools/find-signals.d.ts.map +1 -1
- package/dist/tools/get-endpoint-details.d.ts +7 -1
- package/dist/tools/get-endpoint-details.d.ts.map +1 -1
- package/dist/tools/get-place-reviews.d.ts +8 -3
- package/dist/tools/get-place-reviews.d.ts.map +1 -1
- package/dist/tools/get-website-visitors.d.ts +4 -1
- package/dist/tools/get-website-visitors.d.ts.map +1 -1
- package/dist/tools/search-ads.d.ts +14 -6
- package/dist/tools/search-ads.d.ts.map +1 -1
- package/dist/tools/search-companies.d.ts +15 -12
- package/dist/tools/search-companies.d.ts.map +1 -1
- package/dist/tools/search-jobs.d.ts +54 -22
- package/dist/tools/search-jobs.d.ts.map +1 -1
- package/dist/tools/search-knowledge.d.ts +6 -2
- package/dist/tools/search-knowledge.d.ts.map +1 -1
- package/dist/tools/search-knowledge.js +1 -1
- package/dist/tools/search-knowledge.js.map +1 -1
- package/dist/tools/search-places.d.ts +16 -8
- package/dist/tools/search-places.d.ts.map +1 -1
- package/dist/tools/search-reddit.d.ts +24 -5
- package/dist/tools/search-reddit.d.ts.map +1 -1
- package/dist/tools/search-seo.d.ts +33 -8
- package/dist/tools/search-seo.d.ts.map +1 -1
- package/dist/tools/search-web.d.ts +7 -2
- package/dist/tools/search-web.d.ts.map +1 -1
- package/dist/tools/verify-email.d.ts +1 -1
- package/dist/tools/verify-emails-bulk.d.ts +2 -2
- package/package.json +6 -4
- package/src/tool-json-schema.ts +21 -0
- package/src/tools/call-endpoint.ts +1 -1
- package/src/tools/find-influencers.ts +1 -1
- package/src/tools/search-knowledge.ts +1 -1
- package/tests/gtm/harness.ts +2 -2
- package/tests/tool-json-schema.test.ts +93 -0
|
@@ -2,39 +2,71 @@ import { z } from 'zod';
|
|
|
2
2
|
export declare const searchJobsName = "search_jobs";
|
|
3
3
|
export declare const searchJobsDescription = "Search live job postings as a GTM buying signal \u2014 find companies hiring for specific roles, on specific ATS platforms, in specific regions. Filter routing is automatic: ATS slugs and company-domain filters route to broad career-site coverage (175k+ company sites, 54 ATS platforms); LinkedIn-only filters (seniority, industry, employee count, easy apply) route to LinkedIn. Shared filters (title, location, description, work arrangement, employment type, taxonomies) work everywhere. For aggregated hiring activity at the company level (e.g. \"X is hiring fast\"), use find_signals(signal_type=\"hiring\") instead. Default limit: 25.";
|
|
4
4
|
export declare const searchJobsSchema: {
|
|
5
|
-
title_keywords: z.ZodOptional<z.ZodArray<z.ZodString
|
|
6
|
-
exclude_title_keywords: z.ZodOptional<z.ZodArray<z.ZodString
|
|
7
|
-
locations: z.ZodOptional<z.ZodArray<z.ZodString
|
|
8
|
-
exclude_locations: z.ZodOptional<z.ZodArray<z.ZodString
|
|
9
|
-
description_keywords: z.ZodOptional<z.ZodArray<z.ZodString
|
|
10
|
-
exclude_description_keywords: z.ZodOptional<z.ZodArray<z.ZodString
|
|
11
|
-
companies: z.ZodOptional<z.ZodArray<z.ZodString
|
|
12
|
-
exclude_companies: z.ZodOptional<z.ZodArray<z.ZodString
|
|
5
|
+
title_keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
6
|
+
exclude_title_keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
7
|
+
locations: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
8
|
+
exclude_locations: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
9
|
+
description_keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
10
|
+
exclude_description_keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
11
|
+
companies: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
12
|
+
exclude_companies: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
13
13
|
remote: z.ZodOptional<z.ZodBoolean>;
|
|
14
14
|
exclude_agencies: z.ZodOptional<z.ZodBoolean>;
|
|
15
15
|
posted_after: z.ZodOptional<z.ZodString>;
|
|
16
|
-
time_range: z.ZodDefault<z.ZodOptional<z.ZodEnum<
|
|
16
|
+
time_range: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
17
|
+
"1h": "1h";
|
|
18
|
+
"24h": "24h";
|
|
19
|
+
"7d": "7d";
|
|
20
|
+
"6m": "6m";
|
|
21
|
+
}>>>;
|
|
17
22
|
include_description: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
18
|
-
employment_types: z.ZodOptional<z.ZodArray<z.ZodEnum<
|
|
19
|
-
|
|
20
|
-
|
|
23
|
+
employment_types: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
24
|
+
FULL_TIME: "FULL_TIME";
|
|
25
|
+
PART_TIME: "PART_TIME";
|
|
26
|
+
CONTRACTOR: "CONTRACTOR";
|
|
27
|
+
TEMPORARY: "TEMPORARY";
|
|
28
|
+
INTERN: "INTERN";
|
|
29
|
+
VOLUNTEER: "VOLUNTEER";
|
|
30
|
+
PER_DIEM: "PER_DIEM";
|
|
31
|
+
OTHER: "OTHER";
|
|
32
|
+
}>>>;
|
|
33
|
+
work_arrangements: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
34
|
+
"On-site": "On-site";
|
|
35
|
+
Hybrid: "Hybrid";
|
|
36
|
+
"Remote OK": "Remote OK";
|
|
37
|
+
"Remote Solely": "Remote Solely";
|
|
38
|
+
}>>>;
|
|
39
|
+
experience_levels: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
40
|
+
"0-2": "0-2";
|
|
41
|
+
"2-5": "2-5";
|
|
42
|
+
"5-10": "5-10";
|
|
43
|
+
"10+": "10+";
|
|
44
|
+
}>>>;
|
|
21
45
|
has_salary: z.ZodOptional<z.ZodBoolean>;
|
|
22
46
|
has_visa_sponsorship: z.ZodOptional<z.ZodBoolean>;
|
|
23
|
-
taxonomies: z.ZodOptional<z.ZodArray<z.ZodString
|
|
47
|
+
taxonomies: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
24
48
|
limit: z.ZodDefault<z.ZodNumber>;
|
|
25
|
-
ats_slugs: z.ZodOptional<z.ZodArray<z.ZodString
|
|
26
|
-
exclude_ats_slugs: z.ZodOptional<z.ZodArray<z.ZodString
|
|
27
|
-
company_domains: z.ZodOptional<z.ZodArray<z.ZodString
|
|
28
|
-
exclude_company_domains: z.ZodOptional<z.ZodArray<z.ZodString
|
|
29
|
-
seniority_levels: z.ZodOptional<z.ZodArray<z.ZodEnum<
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
49
|
+
ats_slugs: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
50
|
+
exclude_ats_slugs: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
51
|
+
company_domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
52
|
+
exclude_company_domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
53
|
+
seniority_levels: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
54
|
+
"Entry level": "Entry level";
|
|
55
|
+
Associate: "Associate";
|
|
56
|
+
"Mid-Senior level": "Mid-Senior level";
|
|
57
|
+
Director: "Director";
|
|
58
|
+
Executive: "Executive";
|
|
59
|
+
Internship: "Internship";
|
|
60
|
+
"Not Applicable": "Not Applicable";
|
|
61
|
+
}>>>;
|
|
62
|
+
industries: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
63
|
+
organization_slugs: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
64
|
+
exclude_organization_slugs: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
33
65
|
min_employees: z.ZodOptional<z.ZodNumber>;
|
|
34
66
|
max_employees: z.ZodOptional<z.ZodNumber>;
|
|
35
67
|
easy_apply_only: z.ZodOptional<z.ZodBoolean>;
|
|
36
68
|
exclude_easy_apply: z.ZodOptional<z.ZodBoolean>;
|
|
37
|
-
use_providers: z.ZodOptional<z.ZodArray<z.ZodString
|
|
69
|
+
use_providers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
38
70
|
};
|
|
39
71
|
export declare function searchJobsHandler(input: Record<string, unknown>): Promise<{
|
|
40
72
|
content: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-jobs.d.ts","sourceRoot":"","sources":["../../src/tools/search-jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,cAAc,gBAAgB,CAAA;AAE3C,eAAO,MAAM,qBAAqB,moBACulB,CAAA;AAEznB,eAAO,MAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"search-jobs.d.ts","sourceRoot":"","sources":["../../src/tools/search-jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,cAAc,gBAAgB,CAAA;AAE3C,eAAO,MAAM,qBAAqB,moBACulB,CAAA;AAEznB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuC5B,CAAA;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAErE"}
|
|
@@ -3,8 +3,12 @@ export declare const searchKnowledgeName = "search_knowledge";
|
|
|
3
3
|
export declare const searchKnowledgeDescription: string;
|
|
4
4
|
export declare const searchKnowledgeSchema: {
|
|
5
5
|
query: z.ZodString;
|
|
6
|
-
types: z.ZodOptional<z.ZodArray<z.ZodEnum<
|
|
7
|
-
|
|
6
|
+
types: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
7
|
+
provider: "provider";
|
|
8
|
+
play: "play";
|
|
9
|
+
strategy: "strategy";
|
|
10
|
+
}>>>;
|
|
11
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
8
12
|
};
|
|
9
13
|
export declare function searchKnowledgeHandler(input: Record<string, unknown>): Promise<{
|
|
10
14
|
content: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-knowledge.d.ts","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB,eAAO,MAAM,mBAAmB,qBAAqB,CAAA;AAErD,eAAO,MAAM,0BAA0B,QAIkF,CAAA;AAEzH,eAAO,MAAM,qBAAqB
|
|
1
|
+
{"version":3,"file":"search-knowledge.d.ts","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB,eAAO,MAAM,mBAAmB,qBAAqB,CAAA;AAErD,eAAO,MAAM,0BAA0B,QAIkF,CAAA;AAEzH,eAAO,MAAM,qBAAqB;;;;;;;;CAiBjC,CAAA;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;GAgB1E"}
|
|
@@ -21,8 +21,8 @@ export const searchKnowledgeSchema = {
|
|
|
21
21
|
.int()
|
|
22
22
|
.min(1)
|
|
23
23
|
.max(15)
|
|
24
|
-
.default(5)
|
|
25
24
|
.optional()
|
|
25
|
+
.meta({ default: 5 })
|
|
26
26
|
.describe('Maximum ranked documents to return (default 5, max 15).'),
|
|
27
27
|
};
|
|
28
28
|
export async function searchKnowledgeHandler(input) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-knowledge.js","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAU,CAAA;AACrE,MAAM,2BAA2B,GAAG,CAAC,MAAM,EAAE,UAAU,CAAU,CAAA;AAEjE,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,CAAA;AAErD,MAAM,CAAC,MAAM,0BAA0B,GACrC,gHAAgH;IAChH,kHAAkH;IAClH,iHAAiH;IACjH,uHAAuH,CAAA;AAEzH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,CAAC,sGAAsG,CAAC;IACnH,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,oJAAoJ,CAAC;IACjK,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,
|
|
1
|
+
{"version":3,"file":"search-knowledge.js","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAU,CAAA;AACrE,MAAM,2BAA2B,GAAG,CAAC,MAAM,EAAE,UAAU,CAAU,CAAA;AAEjE,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,CAAA;AAErD,MAAM,CAAC,MAAM,0BAA0B,GACrC,gHAAgH;IAChH,kHAAkH;IAClH,iHAAiH;IACjH,uHAAuH,CAAA;AAEzH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,CAAC,sGAAsG,CAAC;IACnH,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,oJAAoJ,CAAC;IACjK,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;SACpB,QAAQ,CAAC,yDAAyD,CAAC;CACvE,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAA8B;IACzE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,mBAAmB,EAAE;QACrD,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,GAAG,2BAA2B,CAAC;QACtD,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC,CAAA;IACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;iBAC/E,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA;AACjF,CAAC"}
|
|
@@ -6,31 +6,39 @@ export declare const searchPlacesSchema: {
|
|
|
6
6
|
country: z.ZodOptional<z.ZodString>;
|
|
7
7
|
city: z.ZodOptional<z.ZodString>;
|
|
8
8
|
limit: z.ZodDefault<z.ZodNumber>;
|
|
9
|
-
provider: z.ZodOptional<z.ZodEnum<
|
|
9
|
+
provider: z.ZodOptional<z.ZodEnum<{
|
|
10
|
+
openmart: "openmart";
|
|
11
|
+
google_maps: "google_maps";
|
|
12
|
+
}>>;
|
|
10
13
|
state: z.ZodOptional<z.ZodString>;
|
|
11
14
|
zip_code: z.ZodOptional<z.ZodString>;
|
|
12
15
|
lat: z.ZodOptional<z.ZodNumber>;
|
|
13
16
|
long: z.ZodOptional<z.ZodNumber>;
|
|
14
17
|
geo_radius: z.ZodOptional<z.ZodNumber>;
|
|
15
|
-
tags: z.ZodOptional<z.ZodArray<z.ZodString
|
|
18
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
16
19
|
min_overall_rating: z.ZodOptional<z.ZodNumber>;
|
|
17
20
|
max_overall_rating: z.ZodOptional<z.ZodNumber>;
|
|
18
21
|
min_total_reviews: z.ZodOptional<z.ZodNumber>;
|
|
19
22
|
max_total_reviews: z.ZodOptional<z.ZodNumber>;
|
|
20
|
-
ownership_type: z.ZodOptional<z.ZodEnum<
|
|
23
|
+
ownership_type: z.ZodOptional<z.ZodEnum<{
|
|
24
|
+
INDEPENDENT: "INDEPENDENT";
|
|
25
|
+
FAMILY: "FAMILY";
|
|
26
|
+
FRANCHISE: "FRANCHISE";
|
|
27
|
+
CHAIN: "CHAIN";
|
|
28
|
+
}>>;
|
|
21
29
|
has_website: z.ZodOptional<z.ZodBoolean>;
|
|
22
30
|
has_valid_website: z.ZodOptional<z.ZodBoolean>;
|
|
23
31
|
has_contact_info: z.ZodOptional<z.ZodBoolean>;
|
|
24
32
|
min_price_tier: z.ZodOptional<z.ZodNumber>;
|
|
25
33
|
max_price_tier: z.ZodOptional<z.ZodNumber>;
|
|
26
|
-
include_keywords: z.ZodOptional<z.ZodArray<z.ZodString
|
|
27
|
-
exclude_keywords: z.ZodOptional<z.ZodArray<z.ZodString
|
|
28
|
-
exclude_root_domains: z.ZodOptional<z.ZodArray<z.ZodString
|
|
29
|
-
start_urls: z.ZodOptional<z.ZodArray<z.ZodString
|
|
34
|
+
include_keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
35
|
+
exclude_keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
36
|
+
exclude_root_domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
37
|
+
start_urls: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
30
38
|
include_opening_hours: z.ZodOptional<z.ZodBoolean>;
|
|
31
39
|
include_additional_info: z.ZodOptional<z.ZodBoolean>;
|
|
32
40
|
language: z.ZodOptional<z.ZodString>;
|
|
33
|
-
use_providers: z.ZodOptional<z.ZodArray<z.ZodString
|
|
41
|
+
use_providers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
34
42
|
};
|
|
35
43
|
export declare function searchPlacesHandler(input: Record<string, unknown>): Promise<{
|
|
36
44
|
content: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-places.d.ts","sourceRoot":"","sources":["../../src/tools/search-places.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,gBAAgB,kBAAkB,CAAA;AAE/C,eAAO,MAAM,uBAAuB,slBAC0hB,CAAA;AAE9jB,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"search-places.d.ts","sourceRoot":"","sources":["../../src/tools/search-places.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,gBAAgB,kBAAkB,CAAA;AAE/C,eAAO,MAAM,uBAAuB,slBAC0hB,CAAA;AAE9jB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoC9B,CAAA;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAIvE"}
|
|
@@ -2,18 +2,37 @@ import { z } from 'zod';
|
|
|
2
2
|
export declare const searchRedditName = "search_reddit";
|
|
3
3
|
export declare const searchRedditDescription = "Scrape Reddit posts, comments, communities, or users via 1 provider (Reddit Scraper). Provide subreddit/post/user URLs and/or a keyword query. Optionally scope a query to one community, sort, filter by time, include comments, and limit by date. Async (~30\u2013120s). Pricing is returned in the response credit headers.";
|
|
4
4
|
export declare const searchRedditSchema: {
|
|
5
|
-
start_urls: z.ZodOptional<z.ZodArray<z.ZodString
|
|
5
|
+
start_urls: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
6
6
|
query: z.ZodOptional<z.ZodString>;
|
|
7
|
-
search_type: z.ZodDefault<z.ZodEnum<
|
|
7
|
+
search_type: z.ZodDefault<z.ZodEnum<{
|
|
8
|
+
posts: "posts";
|
|
9
|
+
comments: "comments";
|
|
10
|
+
communities: "communities";
|
|
11
|
+
users: "users";
|
|
12
|
+
}>>;
|
|
8
13
|
search_community_name: z.ZodOptional<z.ZodString>;
|
|
9
|
-
sort: z.ZodOptional<z.ZodEnum<
|
|
10
|
-
|
|
14
|
+
sort: z.ZodOptional<z.ZodEnum<{
|
|
15
|
+
comments: "comments";
|
|
16
|
+
relevance: "relevance";
|
|
17
|
+
hot: "hot";
|
|
18
|
+
top: "top";
|
|
19
|
+
new: "new";
|
|
20
|
+
rising: "rising";
|
|
21
|
+
}>>;
|
|
22
|
+
time: z.ZodOptional<z.ZodEnum<{
|
|
23
|
+
hour: "hour";
|
|
24
|
+
day: "day";
|
|
25
|
+
week: "week";
|
|
26
|
+
month: "month";
|
|
27
|
+
year: "year";
|
|
28
|
+
all: "all";
|
|
29
|
+
}>>;
|
|
11
30
|
limit: z.ZodDefault<z.ZodNumber>;
|
|
12
31
|
max_comments: z.ZodOptional<z.ZodNumber>;
|
|
13
32
|
include_comments: z.ZodOptional<z.ZodBoolean>;
|
|
14
33
|
post_date_limit: z.ZodOptional<z.ZodString>;
|
|
15
34
|
comment_date_limit: z.ZodOptional<z.ZodString>;
|
|
16
|
-
use_providers: z.ZodOptional<z.ZodArray<z.ZodString
|
|
35
|
+
use_providers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
17
36
|
};
|
|
18
37
|
export declare function searchRedditHandler(input: Record<string, unknown>): Promise<{
|
|
19
38
|
content: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-reddit.d.ts","sourceRoot":"","sources":["../../src/tools/search-reddit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,gBAAgB,kBAAkB,CAAA;AAE/C,eAAO,MAAM,uBAAuB,oUAC0R,CAAA;AAE9T,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"search-reddit.d.ts","sourceRoot":"","sources":["../../src/tools/search-reddit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,gBAAgB,kBAAkB,CAAA;AAE/C,eAAO,MAAM,uBAAuB,oUAC0R,CAAA;AAE9T,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwB9B,CAAA;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAEvE"}
|
|
@@ -2,25 +2,50 @@ import { z } from 'zod';
|
|
|
2
2
|
export declare const searchSeoName = "search_seo";
|
|
3
3
|
export declare const searchSeoDescription: string;
|
|
4
4
|
export declare const searchSeoSchema: {
|
|
5
|
-
category: z.ZodEnum<
|
|
5
|
+
category: z.ZodEnum<{
|
|
6
|
+
keywords: "keywords";
|
|
7
|
+
domain: "domain";
|
|
8
|
+
page: "page";
|
|
9
|
+
serp: "serp";
|
|
10
|
+
backlinks: "backlinks";
|
|
11
|
+
labs: "labs";
|
|
12
|
+
}>;
|
|
6
13
|
target: z.ZodOptional<z.ZodString>;
|
|
7
14
|
keyword: z.ZodOptional<z.ZodString>;
|
|
8
|
-
keywords: z.ZodOptional<z.ZodArray<z.ZodString
|
|
15
|
+
keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
9
16
|
location: z.ZodOptional<z.ZodString>;
|
|
10
17
|
language: z.ZodOptional<z.ZodString>;
|
|
11
18
|
limit: z.ZodDefault<z.ZodNumber>;
|
|
12
19
|
date_from: z.ZodOptional<z.ZodString>;
|
|
13
20
|
date_to: z.ZodOptional<z.ZodString>;
|
|
14
21
|
time_range: z.ZodOptional<z.ZodString>;
|
|
15
|
-
engine: z.ZodDefault<z.ZodEnum<
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
22
|
+
engine: z.ZodDefault<z.ZodEnum<{
|
|
23
|
+
google: "google";
|
|
24
|
+
youtube: "youtube";
|
|
25
|
+
bing: "bing";
|
|
26
|
+
}>>;
|
|
27
|
+
device: z.ZodOptional<z.ZodEnum<{
|
|
28
|
+
mobile: "mobile";
|
|
29
|
+
desktop: "desktop";
|
|
30
|
+
}>>;
|
|
31
|
+
action: z.ZodOptional<z.ZodEnum<{
|
|
32
|
+
technologies: "technologies";
|
|
33
|
+
whois: "whois";
|
|
34
|
+
}>>;
|
|
35
|
+
lab_action: z.ZodOptional<z.ZodEnum<{
|
|
36
|
+
"rank-overview": "rank-overview";
|
|
37
|
+
"ranked-keywords": "ranked-keywords";
|
|
38
|
+
competitors: "competitors";
|
|
39
|
+
"keyword-ideas": "keyword-ideas";
|
|
40
|
+
}>>;
|
|
19
41
|
url: z.ZodOptional<z.ZodString>;
|
|
20
|
-
page_action: z.ZodDefault<z.ZodEnum<
|
|
42
|
+
page_action: z.ZodDefault<z.ZodEnum<{
|
|
43
|
+
content: "content";
|
|
44
|
+
lighthouse: "lighthouse";
|
|
45
|
+
}>>;
|
|
21
46
|
enable_javascript: z.ZodOptional<z.ZodBoolean>;
|
|
22
47
|
full_data: z.ZodOptional<z.ZodBoolean>;
|
|
23
|
-
use_providers: z.ZodOptional<z.ZodArray<z.ZodString
|
|
48
|
+
use_providers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
24
49
|
};
|
|
25
50
|
export declare function searchSeoHandler(input: Record<string, unknown>): Promise<{
|
|
26
51
|
content: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-seo.d.ts","sourceRoot":"","sources":["../../src/tools/search-seo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,aAAa,eAAe,CAAA;AAEzC,eAAO,MAAM,oBAAoB,QAQiD,CAAA;AAElF,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"search-seo.d.ts","sourceRoot":"","sources":["../../src/tools/search-seo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,aAAa,eAAe,CAAA;AAEzC,eAAO,MAAM,oBAAoB,QAQiD,CAAA;AAElF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoC3B,CAAA;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAEpE"}
|
|
@@ -5,8 +5,13 @@ export declare const searchWebSchema: {
|
|
|
5
5
|
query: z.ZodString;
|
|
6
6
|
num_results: z.ZodDefault<z.ZodNumber>;
|
|
7
7
|
country: z.ZodOptional<z.ZodString>;
|
|
8
|
-
search_type: z.ZodDefault<z.ZodEnum<
|
|
9
|
-
|
|
8
|
+
search_type: z.ZodDefault<z.ZodEnum<{
|
|
9
|
+
deep: "deep";
|
|
10
|
+
"deep-reasoning": "deep-reasoning";
|
|
11
|
+
general: "general";
|
|
12
|
+
neural: "neural";
|
|
13
|
+
}>>;
|
|
14
|
+
use_providers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
10
15
|
};
|
|
11
16
|
export declare function searchWebHandler(input: Record<string, unknown>): Promise<{
|
|
12
17
|
content: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-web.d.ts","sourceRoot":"","sources":["../../src/tools/search-web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,aAAa,eAAe,CAAA;AAEzC,eAAO,MAAM,oBAAoB,QAIsE,CAAA;AAEvG,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"search-web.d.ts","sourceRoot":"","sources":["../../src/tools/search-web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,aAAa,eAAe,CAAA;AAEzC,eAAO,MAAM,oBAAoB,QAIsE,CAAA;AAEvG,eAAO,MAAM,eAAe;;;;;;;;;;;CAM3B,CAAA;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAEpE"}
|
|
@@ -3,7 +3,7 @@ export declare const verifyEmailName = "verify_email";
|
|
|
3
3
|
export declare const verifyEmailDescription = "Check whether an email address is valid and deliverable. Returns a normalized `status` field \u2014 one of \"valid\", \"invalid\", \"catch_all\", \"risky\", \"disposable\", \"unknown\" \u2014 alongside the raw provider response. BounceBan leads the waterfall: it resolves catch-all and risky addresses without sending (the gap most verifiers leave as \"unknown\"); if it cannot conclude, the chain falls through to leadmagic, findymail, icypeas, instantly, and linkupapi. Findymail only distinguishes valid vs invalid. Use before cold outreach to protect sender reputation. ColdIQ automatically runs the waterfall \u2014 pass use_providers only if you need a specific tool.";
|
|
4
4
|
export declare const verifyEmailSchema: {
|
|
5
5
|
email: z.ZodString;
|
|
6
|
-
use_providers: z.ZodOptional<z.ZodArray<z.ZodString
|
|
6
|
+
use_providers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
7
7
|
};
|
|
8
8
|
export declare function verifyEmailHandler(input: Record<string, unknown>): Promise<{
|
|
9
9
|
content: [{
|
|
@@ -2,8 +2,8 @@ import { z } from 'zod';
|
|
|
2
2
|
export declare const verifyEmailsBulkName = "verify_emails_bulk";
|
|
3
3
|
export declare const verifyEmailsBulkDescription: string;
|
|
4
4
|
export declare const verifyEmailsBulkSchema: {
|
|
5
|
-
emails: z.ZodArray<z.ZodString
|
|
6
|
-
use_providers: z.ZodOptional<z.ZodArray<z.ZodString
|
|
5
|
+
emails: z.ZodArray<z.ZodString>;
|
|
6
|
+
use_providers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
7
7
|
webhook_url: z.ZodOptional<z.ZodString>;
|
|
8
8
|
};
|
|
9
9
|
export declare function verifyEmailsBulkHandler(input: Record<string, unknown>): Promise<{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coldiq/mcp",
|
|
3
|
-
"version": "5.4.
|
|
3
|
+
"version": "5.4.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -21,14 +21,16 @@
|
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
23
23
|
"undici": "^6.25.0",
|
|
24
|
-
"zod": "
|
|
24
|
+
"zod": "4.5.4"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@anthropic-ai/sdk": "^0.52.0",
|
|
28
28
|
"@types/node": "^22.0.0",
|
|
29
29
|
"tsx": "^4.19.3",
|
|
30
30
|
"typescript": "^5.8.2",
|
|
31
|
-
"vitest": "^3.1.3"
|
|
32
|
-
|
|
31
|
+
"vitest": "^3.1.3"
|
|
32
|
+
},
|
|
33
|
+
"overrides": {
|
|
34
|
+
"vite": "6.4.3"
|
|
33
35
|
}
|
|
34
36
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
const ToolInputJsonSchema = z.object({
|
|
4
|
+
type: z.literal('object'),
|
|
5
|
+
properties: z.json().optional(),
|
|
6
|
+
}).passthrough()
|
|
7
|
+
|
|
8
|
+
/** Convert a tool input schema without widening Zod object contracts. */
|
|
9
|
+
export function toOpenApiInputSchema(schema: z.ZodObject) {
|
|
10
|
+
const generated = z.toJSONSchema(schema, {
|
|
11
|
+
target: 'openapi-3.0',
|
|
12
|
+
io: 'input',
|
|
13
|
+
override: ({ zodSchema, jsonSchema }) => {
|
|
14
|
+
if (zodSchema instanceof z.ZodObject && jsonSchema.additionalProperties === undefined) {
|
|
15
|
+
jsonSchema.additionalProperties = false
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
return ToolInputJsonSchema.parse(generated)
|
|
21
|
+
}
|
|
@@ -16,7 +16,7 @@ export const callEndpointSchema = {
|
|
|
16
16
|
method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']).optional()
|
|
17
17
|
.describe('HTTP method from search_endpoints. Set this when one path supports more than one method.'),
|
|
18
18
|
params: z
|
|
19
|
-
.record(z.unknown())
|
|
19
|
+
.record(z.string(), z.unknown())
|
|
20
20
|
.optional()
|
|
21
21
|
.describe('Provider-native request params (request body fields, plus any path/query params), as shown in get_endpoint_details.'),
|
|
22
22
|
}
|
|
@@ -13,7 +13,7 @@ export const findInfluencersSchema = {
|
|
|
13
13
|
.describe('Target platform.'),
|
|
14
14
|
limit: z.number().int().min(1).max(100).default(25)
|
|
15
15
|
.describe('Max creators to return (1–100). Pricing is returned in the response credit headers.'),
|
|
16
|
-
page: z.number().int().min(1).
|
|
16
|
+
page: z.number().int().min(1).optional().meta({ default: 1 })
|
|
17
17
|
.describe('Page number for pagination.'),
|
|
18
18
|
sort_by: z.enum(['relevancy', 'number_of_followers', 'engagement_rate']).optional(),
|
|
19
19
|
sort_order: z.enum(['asc', 'desc']).optional(),
|
package/tests/gtm/harness.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import Anthropic from '@anthropic-ai/sdk'
|
|
2
|
-
import { zodToJsonSchema } from 'zod-to-json-schema'
|
|
3
2
|
import * as fs from 'node:fs'
|
|
4
3
|
import * as path from 'node:path'
|
|
5
4
|
import * as url from 'node:url'
|
|
6
5
|
|
|
7
6
|
import { MODEL_PROFILES } from '../../../src/agent/model-policy.js'
|
|
7
|
+
import { toOpenApiInputSchema } from '../../src/tool-json-schema.js'
|
|
8
8
|
import { MCP_TOOLS } from './tools-bridge.js'
|
|
9
9
|
|
|
10
10
|
export interface ToolCall {
|
|
@@ -49,7 +49,7 @@ export async function runAgent(options: RunAgentOptions): Promise<AgentResult> {
|
|
|
49
49
|
const anthropicTools: Anthropic.Tool[] = MCP_TOOLS.map((t) => ({
|
|
50
50
|
name: t.name,
|
|
51
51
|
description: t.description,
|
|
52
|
-
input_schema:
|
|
52
|
+
input_schema: toOpenApiInputSchema(t.schema),
|
|
53
53
|
}))
|
|
54
54
|
|
|
55
55
|
const messages: Anthropic.MessageParam[] = [{ role: 'user', content: prompt }]
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { readdirSync, readFileSync } from 'node:fs'
|
|
2
|
+
import { describe, expect, it } from 'vitest'
|
|
3
|
+
import { z } from 'zod'
|
|
4
|
+
|
|
5
|
+
import { toOpenApiInputSchema } from '../src/tool-json-schema.js'
|
|
6
|
+
import { MCP_TOOLS } from './gtm/tools-bridge.js'
|
|
7
|
+
|
|
8
|
+
const PublicToolSchema = z.record(z.string(), z.instanceof(z.ZodType))
|
|
9
|
+
|
|
10
|
+
describe('public MCP tool JSON schemas', () => {
|
|
11
|
+
it('converts every registered public tool schema', async () => {
|
|
12
|
+
const toolFiles = readdirSync(new URL('../src/tools/', import.meta.url))
|
|
13
|
+
.filter((file) => file.endsWith('.ts'))
|
|
14
|
+
.sort()
|
|
15
|
+
const indexSource = readFileSync(new URL('../src/index.ts', import.meta.url), 'utf8')
|
|
16
|
+
|
|
17
|
+
expect(indexSource.match(/server\.tool\(/g)).toHaveLength(toolFiles.length)
|
|
18
|
+
|
|
19
|
+
for (const file of toolFiles) {
|
|
20
|
+
const exports = await import(new URL(`../src/tools/${file}`, import.meta.url).href)
|
|
21
|
+
const schemaEntries = Object.entries(exports).filter(([name]) => name.endsWith('Schema'))
|
|
22
|
+
const nameEntries = Object.entries(exports).filter(([name]) => name.endsWith('Name'))
|
|
23
|
+
|
|
24
|
+
expect(schemaEntries, file).toHaveLength(1)
|
|
25
|
+
expect(nameEntries, file).toHaveLength(1)
|
|
26
|
+
|
|
27
|
+
const schema = toOpenApiInputSchema(z.object(PublicToolSchema.parse(schemaEntries[0][1])))
|
|
28
|
+
expect(schema, z.string().parse(nameEntries[0][1])).toMatchObject({
|
|
29
|
+
type: 'object',
|
|
30
|
+
additionalProperties: false,
|
|
31
|
+
properties: expect.any(Object),
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
it('converts every tool schema without widening object inputs', () => {
|
|
37
|
+
for (const tool of MCP_TOOLS) {
|
|
38
|
+
const schema = toOpenApiInputSchema(tool.schema)
|
|
39
|
+
|
|
40
|
+
expect(schema, tool.name).toMatchObject({
|
|
41
|
+
type: 'object',
|
|
42
|
+
additionalProperties: false,
|
|
43
|
+
properties: expect.any(Object),
|
|
44
|
+
})
|
|
45
|
+
expect(schema, tool.name).not.toHaveProperty('$schema')
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it('closes only Zod objects and does not change record or default data', () => {
|
|
50
|
+
const schema = toOpenApiInputSchema(z.object({
|
|
51
|
+
nested: z.object({ value: z.string() }),
|
|
52
|
+
labels: z.record(z.string(), z.string()),
|
|
53
|
+
settings: z.object({ type: z.literal('object') }).default({ type: 'object' }),
|
|
54
|
+
}))
|
|
55
|
+
|
|
56
|
+
expect(schema).toMatchObject({
|
|
57
|
+
properties: {
|
|
58
|
+
nested: { additionalProperties: false },
|
|
59
|
+
labels: { additionalProperties: { type: 'string' } },
|
|
60
|
+
settings: {
|
|
61
|
+
additionalProperties: false,
|
|
62
|
+
default: { type: 'object' },
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
})
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
it('preserves required fields, defaults, limits, and optional defaults', () => {
|
|
69
|
+
const tool = MCP_TOOLS.find((candidate) => candidate.name === 'find_influencers')
|
|
70
|
+
expect(tool).toBeDefined()
|
|
71
|
+
if (!tool) throw new Error('find_influencers is not registered')
|
|
72
|
+
|
|
73
|
+
const schema = toOpenApiInputSchema(tool.schema)
|
|
74
|
+
|
|
75
|
+
expect(schema.required).toEqual(['platform'])
|
|
76
|
+
expect(schema).toMatchObject({
|
|
77
|
+
properties: {
|
|
78
|
+
limit: {
|
|
79
|
+
type: 'integer',
|
|
80
|
+
minimum: 1,
|
|
81
|
+
maximum: 100,
|
|
82
|
+
default: 25,
|
|
83
|
+
},
|
|
84
|
+
page: {
|
|
85
|
+
type: 'integer',
|
|
86
|
+
minimum: 1,
|
|
87
|
+
default: 1,
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
})
|
|
91
|
+
expect(schema.properties?.page).not.toHaveProperty('nullable')
|
|
92
|
+
})
|
|
93
|
+
})
|