alterlab-mcp-server 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/client.d.ts +9 -1
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +42 -0
  4. package/dist/client.js.map +1 -1
  5. package/dist/errors.d.ts.map +1 -1
  6. package/dist/errors.js +5 -1
  7. package/dist/errors.js.map +1 -1
  8. package/dist/format.js +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +16 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/tools/batch.d.ts +75 -0
  13. package/dist/tools/batch.d.ts.map +1 -0
  14. package/dist/tools/batch.js +175 -0
  15. package/dist/tools/batch.js.map +1 -0
  16. package/dist/tools/crawl.d.ts +70 -0
  17. package/dist/tools/crawl.d.ts.map +1 -0
  18. package/dist/tools/crawl.js +219 -0
  19. package/dist/tools/crawl.js.map +1 -0
  20. package/dist/tools/estimate.d.ts.map +1 -1
  21. package/dist/tools/estimate.js +1 -1
  22. package/dist/tools/estimate.js.map +1 -1
  23. package/dist/tools/extract.d.ts +17 -11
  24. package/dist/tools/extract.d.ts.map +1 -1
  25. package/dist/tools/extract.js +97 -27
  26. package/dist/tools/extract.js.map +1 -1
  27. package/dist/tools/map.d.ts +40 -0
  28. package/dist/tools/map.d.ts.map +1 -0
  29. package/dist/tools/map.js +139 -0
  30. package/dist/tools/map.js.map +1 -0
  31. package/dist/tools/scrape.d.ts +33 -6
  32. package/dist/tools/scrape.d.ts.map +1 -1
  33. package/dist/tools/scrape.js +57 -8
  34. package/dist/tools/scrape.js.map +1 -1
  35. package/dist/tools/search.d.ts +40 -0
  36. package/dist/tools/search.d.ts.map +1 -0
  37. package/dist/tools/search.js +147 -0
  38. package/dist/tools/search.js.map +1 -0
  39. package/dist/types.d.ts +189 -2
  40. package/dist/types.d.ts.map +1 -1
  41. package/dist/types.js +3 -3
  42. package/dist/types.js.map +1 -1
  43. package/package.json +1 -1
  44. package/server.json +9 -12
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapDescription = exports.mapSchema = void 0;
4
+ exports.handleMap = handleMap;
5
+ const zod_1 = require("zod");
6
+ const errors_js_1 = require("../errors.js");
7
+ exports.mapSchema = zod_1.z.object({
8
+ url: zod_1.z.string().url().describe("Starting URL for site discovery"),
9
+ max_pages: zod_1.z
10
+ .number()
11
+ .int()
12
+ .min(1)
13
+ .max(50000)
14
+ .default(500)
15
+ .describe("Maximum URLs to discover"),
16
+ max_depth: zod_1.z
17
+ .number()
18
+ .int()
19
+ .min(0)
20
+ .max(10)
21
+ .default(3)
22
+ .describe("Link-following depth (0 = start page + sitemap only)"),
23
+ include_patterns: zod_1.z
24
+ .array(zod_1.z.string())
25
+ .optional()
26
+ .describe("Glob patterns — only include URLs whose path matches at least one (e.g., ['/docs/*'])"),
27
+ exclude_patterns: zod_1.z
28
+ .array(zod_1.z.string())
29
+ .optional()
30
+ .describe("Glob patterns — exclude URLs whose path matches any (e.g., ['/tag/*', '/page/*'])"),
31
+ search: zod_1.z
32
+ .string()
33
+ .max(500)
34
+ .optional()
35
+ .describe("Query to filter and rank discovered URLs by relevance (returns relevance_score per URL)"),
36
+ sitemap: zod_1.z
37
+ .enum(["skip", "include", "only"])
38
+ .default("include")
39
+ .describe("Sitemap handling: include (parse sitemaps + follow links), skip (links only), only (sitemap URLs only)"),
40
+ include_metadata: zod_1.z
41
+ .boolean()
42
+ .default(false)
43
+ .describe("Fetch title and meta description for each URL via lightweight GET (adds latency)"),
44
+ include_subdomains: zod_1.z
45
+ .boolean()
46
+ .default(false)
47
+ .describe("Include URLs from subdomains of the target domain"),
48
+ respect_robots: zod_1.z
49
+ .boolean()
50
+ .default(true)
51
+ .describe("Respect robots.txt directives"),
52
+ });
53
+ exports.mapDescription = "Discover all URLs on a website via sitemap parsing and link extraction. " +
54
+ "No JS rendering, no content scraping — pure lightweight URL discovery. " +
55
+ "Costs $0.001 per call regardless of how many URLs are found. " +
56
+ "Returns a flat list of URLs with source (sitemap/link) and depth. " +
57
+ "Use include_patterns/exclude_patterns to scope discovery to specific sections. " +
58
+ "Use search to rank URLs by relevance to a query. " +
59
+ "Use include_metadata=true to also fetch page titles and descriptions.";
60
+ async function handleMap(client, params) {
61
+ try {
62
+ const response = await client.map({
63
+ url: params.url,
64
+ max_pages: params.max_pages,
65
+ max_depth: params.max_depth,
66
+ include_patterns: params.include_patterns,
67
+ exclude_patterns: params.exclude_patterns,
68
+ search: params.search,
69
+ sitemap: params.sitemap,
70
+ include_metadata: params.include_metadata,
71
+ include_subdomains: params.include_subdomains,
72
+ respect_robots: params.respect_robots,
73
+ });
74
+ const text = formatMapResponse(response, params.url);
75
+ return { content: [{ type: "text", text }] };
76
+ }
77
+ catch (error) {
78
+ if (isApiError(error)) {
79
+ return (0, errors_js_1.formatErrorResult)(error, { url: params.url });
80
+ }
81
+ return (0, errors_js_1.formatErrorResult)(error, { url: params.url });
82
+ }
83
+ }
84
+ function formatMapResponse(response, startUrl) {
85
+ const r = response;
86
+ const mapId = String(r.map_id ?? "");
87
+ const totalUrls = Number(r.total_urls ?? 0);
88
+ const sitemapFound = Boolean(r.sitemap_found);
89
+ const creditsUsed = Number(r.credits_used ?? 0);
90
+ const urls = Array.isArray(r.urls) ? r.urls : [];
91
+ const parts = [
92
+ `**Site Map: ${startUrl}**\n`,
93
+ `- Map ID: \`${mapId}\``,
94
+ `- URLs discovered: ${totalUrls}`,
95
+ `- Sitemap found: ${sitemapFound ? "Yes" : "No"}`,
96
+ `- Credits used: ${creditsUsed}`,
97
+ "",
98
+ ];
99
+ // robots.txt info
100
+ const robotsTxt = r.robots_txt;
101
+ if (robotsTxt && robotsTxt.exists) {
102
+ const disallowed = Array.isArray(robotsTxt.disallowed_paths)
103
+ ? robotsTxt.disallowed_paths
104
+ : [];
105
+ if (disallowed.length > 0) {
106
+ parts.push(`**robots.txt**: ${disallowed.length} disallowed path${disallowed.length !== 1 ? "s" : ""}`);
107
+ }
108
+ }
109
+ // Show up to 50 URLs
110
+ const preview = urls.slice(0, 50);
111
+ if (preview.length > 0) {
112
+ parts.push(`\n**Discovered URLs** (showing ${preview.length} of ${totalUrls}):\n`);
113
+ for (const entry of preview) {
114
+ const e = entry;
115
+ const url = String(e.url ?? "");
116
+ const source = String(e.source ?? "");
117
+ const depth = Number(e.depth ?? 0);
118
+ const title = e.title ? ` — ${String(e.title)}` : "";
119
+ const score = e.relevance_score !== null && e.relevance_score !== undefined
120
+ ? ` [relevance: ${Number(e.relevance_score).toFixed(2)}]`
121
+ : "";
122
+ parts.push(`- [${source}, depth ${depth}] ${url}${title}${score}`);
123
+ }
124
+ if (totalUrls > 50) {
125
+ parts.push(`\n... and ${totalUrls - 50} more URLs`);
126
+ }
127
+ }
128
+ else {
129
+ parts.push("No URLs discovered.");
130
+ }
131
+ return parts.join("\n");
132
+ }
133
+ function isApiError(error) {
134
+ return (typeof error === "object" &&
135
+ error !== null &&
136
+ "status" in error &&
137
+ typeof error.status === "number");
138
+ }
139
+ //# sourceMappingURL=map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/tools/map.ts"],"names":[],"mappings":"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"}
@@ -4,8 +4,8 @@ import type { AlterLabClient } from "../client.js";
4
4
  export declare const scrapeSchema: z.ZodObject<{
5
5
  url: z.ZodString;
6
6
  mode: z.ZodDefault<z.ZodEnum<["auto", "html", "js", "pdf", "ocr"]>>;
7
- formats: z.ZodDefault<z.ZodArray<z.ZodEnum<["text", "json", "html", "markdown"]>, "many">>;
8
- render_js: z.ZodDefault<z.ZodBoolean>;
7
+ formats: z.ZodDefault<z.ZodArray<z.ZodEnum<["text", "json", "json_v2", "html", "markdown", "rag"]>, "many">>;
8
+ render_js: z.ZodDefault<z.ZodUnion<[z.ZodBoolean, z.ZodLiteral<"auto">]>>;
9
9
  use_proxy: z.ZodDefault<z.ZodBoolean>;
10
10
  proxy_country: z.ZodOptional<z.ZodString>;
11
11
  wait_for: z.ZodOptional<z.ZodString>;
@@ -13,30 +13,57 @@ export declare const scrapeSchema: z.ZodObject<{
13
13
  include_raw_html: z.ZodDefault<z.ZodBoolean>;
14
14
  session_id: z.ZodOptional<z.ZodString>;
15
15
  cookies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
16
+ scroll_to_load: z.ZodDefault<z.ZodBoolean>;
17
+ scroll_count: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
18
+ remove_cookie_banners: z.ZodDefault<z.ZodBoolean>;
19
+ location: z.ZodOptional<z.ZodObject<{
20
+ country: z.ZodOptional<z.ZodString>;
21
+ language: z.ZodOptional<z.ZodString>;
22
+ }, "strip", z.ZodTypeAny, {
23
+ country?: string | undefined;
24
+ language?: string | undefined;
25
+ }, {
26
+ country?: string | undefined;
27
+ language?: string | undefined;
28
+ }>>;
16
29
  }, "strip", z.ZodTypeAny, {
17
30
  url: string;
18
31
  timeout: number;
19
32
  mode: "auto" | "html" | "js" | "pdf" | "ocr";
20
- formats: ("text" | "html" | "json" | "markdown")[];
21
- render_js: boolean;
33
+ formats: ("text" | "html" | "json" | "json_v2" | "markdown" | "rag")[];
34
+ render_js: boolean | "auto";
22
35
  use_proxy: boolean;
23
36
  include_raw_html: boolean;
37
+ scroll_to_load: boolean;
38
+ remove_cookie_banners: boolean;
24
39
  proxy_country?: string | undefined;
25
40
  wait_for?: string | undefined;
26
41
  session_id?: string | undefined;
27
42
  cookies?: Record<string, string> | undefined;
43
+ scroll_count?: number | undefined;
44
+ location?: {
45
+ country?: string | undefined;
46
+ language?: string | undefined;
47
+ } | undefined;
28
48
  }, {
29
49
  url: string;
30
50
  timeout?: number | undefined;
31
51
  mode?: "auto" | "html" | "js" | "pdf" | "ocr" | undefined;
32
- formats?: ("text" | "html" | "json" | "markdown")[] | undefined;
33
- render_js?: boolean | undefined;
52
+ formats?: ("text" | "html" | "json" | "json_v2" | "markdown" | "rag")[] | undefined;
53
+ render_js?: boolean | "auto" | undefined;
34
54
  use_proxy?: boolean | undefined;
35
55
  proxy_country?: string | undefined;
36
56
  wait_for?: string | undefined;
37
57
  include_raw_html?: boolean | undefined;
38
58
  session_id?: string | undefined;
39
59
  cookies?: Record<string, string> | undefined;
60
+ scroll_to_load?: boolean | undefined;
61
+ scroll_count?: number | undefined;
62
+ remove_cookie_banners?: boolean | undefined;
63
+ location?: {
64
+ country?: string | undefined;
65
+ language?: string | undefined;
66
+ } | undefined;
40
67
  }>;
41
68
  export declare const scrapeDescription: string;
42
69
  export declare function handleScrape(client: AlterLabClient, params: z.infer<typeof scrapeSchema>): Promise<CallToolResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"scrape.d.ts","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAInD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqDvB,CAAC;AAEH,eAAO,MAAM,iBAAiB,QAMwD,CAAC;AAEvF,wBAAsB,YAAY,CAChC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,GACnC,OAAO,CAAC,cAAc,CAAC,CA6BzB"}
1
+ {"version":3,"file":"scrape.d.ts","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAInD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqHvB,CAAC;AAEH,eAAO,MAAM,iBAAiB,QAW0B,CAAC;AAEzD,wBAAsB,YAAY,CAChC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,GACnC,OAAO,CAAC,cAAc,CAAC,CAiCzB"}
@@ -12,17 +12,21 @@ exports.scrapeSchema = zod_1.z.object({
12
12
  .default("auto")
13
13
  .describe("Scraping mode: auto (recommended), html, js (headless browser), pdf, or ocr"),
14
14
  formats: zod_1.z
15
- .array(zod_1.z.enum(["text", "json", "html", "markdown"]))
15
+ .array(zod_1.z.enum(["text", "json", "json_v2", "html", "markdown", "rag"]))
16
16
  .default(["markdown"])
17
- .describe("Output formats. 'markdown' is best for LLM consumption"),
17
+ .describe("Output formats. 'markdown' is best for LLM consumption. " +
18
+ "'json_v2' returns a structured section tree (headings + content blocks). " +
19
+ "'rag' returns chunked text optimized for retrieval-augmented generation."),
18
20
  render_js: zod_1.z
19
- .boolean()
21
+ .union([zod_1.z.boolean(), zod_1.z.literal("auto")])
20
22
  .default(false)
21
- .describe("Render JavaScript using headless browser (+3 credits). Required for JS-heavy sites"),
23
+ .describe("Render JavaScript using headless browser (forces Tier 4 minimum — no separate add-on charge). " +
24
+ "Required for JS-heavy sites. Set to 'auto' for smart detection (probes each page, " +
25
+ "only renders JS-heavy pages with browser — saves 30-60% on mixed sites)."),
22
26
  use_proxy: zod_1.z
23
27
  .boolean()
24
28
  .default(false)
25
- .describe("Route through premium proxy (+1 credit). Helps bypass geo-restrictions and anti-bot"),
29
+ .describe("Route through premium proxy (+$0.0002). Helps bypass geo-restrictions and anti-bot"),
26
30
  proxy_country: zod_1.z
27
31
  .string()
28
32
  .optional()
@@ -52,15 +56,56 @@ exports.scrapeSchema = zod_1.z.object({
52
56
  .record(zod_1.z.string(), zod_1.z.string())
53
57
  .optional()
54
58
  .describe("Inline cookies as key-value pairs for authenticated scraping " +
55
- "(e.g., {\"session_token\": \"abc123\"}). " +
59
+ '(e.g., {"session_token": "abc123"}). ' +
56
60
  "Use this for one-off requests; use session_id for reusable sessions."),
61
+ scroll_to_load: zod_1.z
62
+ .boolean()
63
+ .default(false)
64
+ .describe("Scroll page to trigger lazy-loaded content (requires render_js). " +
65
+ "Performs explicit viewport-height scrolls to load dynamic content. Adds ~2-3s latency."),
66
+ scroll_count: zod_1.z
67
+ .number()
68
+ .int()
69
+ .min(1)
70
+ .max(10)
71
+ .default(3)
72
+ .optional()
73
+ .describe("Number of scroll iterations when scroll_to_load is enabled (1-10, default 3)"),
74
+ remove_cookie_banners: zod_1.z
75
+ .boolean()
76
+ .default(true)
77
+ .describe("Remove cookie consent banners from HTML before content extraction (free, enabled by default)"),
78
+ location: zod_1.z
79
+ .object({
80
+ country: zod_1.z
81
+ .string()
82
+ .length(2)
83
+ .optional()
84
+ .describe("ISO 3166-1 alpha-2 country code for geo-targeting (e.g., 'US', 'DE', 'JP'). " +
85
+ "Routes request through a proxy in the specified country."),
86
+ language: zod_1.z
87
+ .string()
88
+ .min(2)
89
+ .max(5)
90
+ .optional()
91
+ .describe("ISO 639-1 language code (e.g., 'en', 'de', 'ja'). " +
92
+ "Sets the Accept-Language header and browser locale."),
93
+ })
94
+ .optional()
95
+ .describe("Geo-targeting parameters for localized content scraping. " +
96
+ "Controls proxy country routing, Accept-Language header, and browser locale."),
57
97
  });
58
- exports.scrapeDescription = "Scrape a URL and return its content as markdown, text, HTML, or JSON. " +
98
+ exports.scrapeDescription = "Scrape a URL and return its content as markdown, text, HTML, JSON, or structured sections. " +
59
99
  "Automatically handles anti-bot protection with tier escalation. " +
60
100
  "Returns markdown by default — optimized for LLM context. " +
61
101
  "Use render_js=true for JavaScript-heavy sites (React, Angular, SPAs). " +
102
+ "Use render_js='auto' for mixed sites to detect JS needs per-page (saves 30-60%). " +
62
103
  "Use use_proxy=true for geo-restricted or heavily protected sites. " +
63
- "Supports authenticated scraping via session_id (stored session) or inline cookies.";
104
+ "Use formats=['json_v2'] for a structured section tree (headings + content blocks). " +
105
+ "Use formats=['rag'] for chunked text optimized for RAG pipelines. " +
106
+ "Supports authenticated scraping via session_id (stored session) or inline cookies. " +
107
+ "Use scroll_to_load=true for infinite-scroll pages that lazy-load content. " +
108
+ "Use location.country to scrape geo-targeted content.";
64
109
  async function handleScrape(client, params) {
65
110
  try {
66
111
  const response = await client.scrape({
@@ -73,11 +118,15 @@ async function handleScrape(client, params) {
73
118
  wait_for: params.wait_for,
74
119
  session_id: params.session_id,
75
120
  cookies: params.cookies,
121
+ location: params.location,
76
122
  advanced: {
77
123
  render_js: params.render_js,
78
124
  use_proxy: params.use_proxy,
79
125
  proxy_country: params.proxy_country,
80
126
  markdown: params.formats.includes("markdown"),
127
+ scroll_to_load: params.scroll_to_load,
128
+ scroll_count: params.scroll_count,
129
+ remove_cookie_banners: params.remove_cookie_banners,
81
130
  },
82
131
  });
83
132
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
3
+ import type { AlterLabClient } from "../client.js";
4
+ export declare const searchSchema: z.ZodObject<{
5
+ query: z.ZodString;
6
+ num_results: z.ZodDefault<z.ZodNumber>;
7
+ page: z.ZodDefault<z.ZodNumber>;
8
+ domain: z.ZodOptional<z.ZodString>;
9
+ country: z.ZodOptional<z.ZodString>;
10
+ language: z.ZodOptional<z.ZodString>;
11
+ time_range: z.ZodOptional<z.ZodEnum<["hour", "day", "week", "month", "year"]>>;
12
+ scrape_results: z.ZodDefault<z.ZodBoolean>;
13
+ formats: z.ZodOptional<z.ZodArray<z.ZodEnum<["text", "json", "json_v2", "html", "markdown"]>, "many">>;
14
+ extraction_schema: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ query: string;
17
+ num_results: number;
18
+ page: number;
19
+ scrape_results: boolean;
20
+ formats?: ("text" | "html" | "json" | "json_v2" | "markdown")[] | undefined;
21
+ country?: string | undefined;
22
+ language?: string | undefined;
23
+ extraction_schema?: Record<string, unknown> | undefined;
24
+ domain?: string | undefined;
25
+ time_range?: "hour" | "day" | "week" | "month" | "year" | undefined;
26
+ }, {
27
+ query: string;
28
+ formats?: ("text" | "html" | "json" | "json_v2" | "markdown")[] | undefined;
29
+ country?: string | undefined;
30
+ language?: string | undefined;
31
+ extraction_schema?: Record<string, unknown> | undefined;
32
+ num_results?: number | undefined;
33
+ page?: number | undefined;
34
+ domain?: string | undefined;
35
+ time_range?: "hour" | "day" | "week" | "month" | "year" | undefined;
36
+ scrape_results?: boolean | undefined;
37
+ }>;
38
+ export declare const searchDescription: string;
39
+ export declare function handleSearch(client: AlterLabClient, params: z.infer<typeof searchSchema>): Promise<CallToolResult>;
40
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4DvB,CAAC;AAEH,eAAO,MAAM,iBAAiB,QAOqC,CAAC;AAEpE,wBAAsB,YAAY,CAChC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,GACnC,OAAO,CAAC,cAAc,CAAC,CAuBzB"}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.searchDescription = exports.searchSchema = void 0;
4
+ exports.handleSearch = handleSearch;
5
+ const zod_1 = require("zod");
6
+ const errors_js_1 = require("../errors.js");
7
+ exports.searchSchema = zod_1.z.object({
8
+ query: zod_1.z
9
+ .string()
10
+ .min(1)
11
+ .max(500)
12
+ .describe("Search query (max 500 characters)"),
13
+ num_results: zod_1.z
14
+ .number()
15
+ .int()
16
+ .min(1)
17
+ .max(30)
18
+ .default(10)
19
+ .describe("Number of results to return (1-30)"),
20
+ page: zod_1.z
21
+ .number()
22
+ .int()
23
+ .min(1)
24
+ .max(10)
25
+ .default(1)
26
+ .describe("Result page number (1-indexed). Page 2 returns results 11-20, etc."),
27
+ domain: zod_1.z
28
+ .string()
29
+ .optional()
30
+ .describe("Restrict results to a specific domain (applied as site: prefix, e.g. 'docs.example.com')"),
31
+ country: zod_1.z
32
+ .string()
33
+ .length(2)
34
+ .optional()
35
+ .describe("ISO 3166-1 alpha-2 country code for geo-targeted results (e.g., 'US', 'GB', 'DE')"),
36
+ language: zod_1.z
37
+ .string()
38
+ .min(2)
39
+ .max(5)
40
+ .optional()
41
+ .describe("Language code for results (e.g., 'en', 'fr', 'de')"),
42
+ time_range: zod_1.z
43
+ .enum(["hour", "day", "week", "month", "year"])
44
+ .optional()
45
+ .describe("Filter results by recency"),
46
+ scrape_results: zod_1.z
47
+ .boolean()
48
+ .default(false)
49
+ .describe("If true, scrape each result page and include content in response. " +
50
+ "Each page is billed at its scraping tier cost in addition to the base search fee."),
51
+ formats: zod_1.z
52
+ .array(zod_1.z.enum(["text", "json", "json_v2", "html", "markdown"]))
53
+ .optional()
54
+ .describe("Output formats when scrape_results=true"),
55
+ extraction_schema: zod_1.z
56
+ .record(zod_1.z.unknown())
57
+ .optional()
58
+ .describe("JSON schema for structured extraction when scrape_results=true"),
59
+ });
60
+ exports.searchDescription = "Execute a web search and return SERP results (URLs, titles, snippets). " +
61
+ "Uses AlterLab's own SERP engine with Google/Bing/DuckDuckGo multi-engine failover. " +
62
+ "Costs $0.001 per search query. " +
63
+ "Set scrape_results=true to also scrape each result page and get full content — " +
64
+ "each page is billed at its normal scraping tier cost. " +
65
+ "Use domain to restrict results to a specific site (equivalent to site: operator). " +
66
+ "Use time_range to filter by recency (hour/day/week/month/year).";
67
+ async function handleSearch(client, params) {
68
+ try {
69
+ const response = await client.search({
70
+ query: params.query,
71
+ num_results: params.num_results,
72
+ page: params.page,
73
+ domain: params.domain,
74
+ country: params.country,
75
+ language: params.language,
76
+ time_range: params.time_range,
77
+ scrape_results: params.scrape_results,
78
+ formats: params.formats,
79
+ extraction_schema: params.extraction_schema,
80
+ });
81
+ const text = formatSearchResponse(response, params.query);
82
+ return { content: [{ type: "text", text }] };
83
+ }
84
+ catch (error) {
85
+ if (isApiError(error)) {
86
+ return (0, errors_js_1.formatErrorResult)(error, { url: params.query });
87
+ }
88
+ return (0, errors_js_1.formatErrorResult)(error, { url: params.query });
89
+ }
90
+ }
91
+ function formatSearchResponse(response, query) {
92
+ const resp = response;
93
+ const searchId = String(resp.search_id ?? "");
94
+ const results = Array.isArray(resp.results) ? resp.results : [];
95
+ const resultsCount = Number(resp.results_count ?? results.length);
96
+ const creditsUsed = Number(resp.credits_used ?? 0);
97
+ const costBreakdown = resp.cost_breakdown;
98
+ const parts = [
99
+ `**Search Results for: "${query}"**\n`,
100
+ `Found ${resultsCount} result${resultsCount !== 1 ? "s" : ""} | Search ID: \`${searchId}\`\n`,
101
+ ];
102
+ for (const result of results) {
103
+ const r = result;
104
+ const position = Number(r.position ?? 0);
105
+ const title = String(r.title ?? "Untitled");
106
+ const url = String(r.url ?? "");
107
+ const snippet = String(r.snippet ?? "");
108
+ const datePublished = r.date_published
109
+ ? ` (${String(r.date_published)})`
110
+ : "";
111
+ parts.push(`**${position}. ${title}**${datePublished}`);
112
+ parts.push(`${url}`);
113
+ parts.push(`${snippet}\n`);
114
+ // Include scraped content if available
115
+ const content = r.content;
116
+ if (content) {
117
+ const scrapeText = content.markdown ||
118
+ content.text;
119
+ if (scrapeText) {
120
+ const preview = scrapeText.slice(0, 500);
121
+ parts.push(`> ${preview}${scrapeText.length > 500 ? "..." : ""}\n`);
122
+ }
123
+ }
124
+ }
125
+ // Cost footer
126
+ parts.push("---");
127
+ if (costBreakdown) {
128
+ const total = Number(costBreakdown.total_microcents ?? 0);
129
+ parts.push(`Cost: $${(total / 1_000_000).toFixed(6)} | Credits: ${creditsUsed}`);
130
+ }
131
+ else {
132
+ parts.push(`Credits used: ${creditsUsed}`);
133
+ }
134
+ // Featured snippet, knowledge panel, PAA
135
+ const featuredSnippet = resp.featured_snippet;
136
+ if (featuredSnippet) {
137
+ parts.unshift(`**Featured Snippet**: ${String(featuredSnippet.content ?? "")}\n`);
138
+ }
139
+ return parts.join("\n");
140
+ }
141
+ function isApiError(error) {
142
+ return (typeof error === "object" &&
143
+ error !== null &&
144
+ "status" in error &&
145
+ typeof error.status === "number");
146
+ }
147
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}