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.
- package/dist/client.d.ts +9 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +42 -0
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +5 -1
- package/dist/errors.js.map +1 -1
- package/dist/format.js +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/batch.d.ts +75 -0
- package/dist/tools/batch.d.ts.map +1 -0
- package/dist/tools/batch.js +175 -0
- package/dist/tools/batch.js.map +1 -0
- package/dist/tools/crawl.d.ts +70 -0
- package/dist/tools/crawl.d.ts.map +1 -0
- package/dist/tools/crawl.js +219 -0
- package/dist/tools/crawl.js.map +1 -0
- package/dist/tools/estimate.d.ts.map +1 -1
- package/dist/tools/estimate.js +1 -1
- package/dist/tools/estimate.js.map +1 -1
- package/dist/tools/extract.d.ts +17 -11
- package/dist/tools/extract.d.ts.map +1 -1
- package/dist/tools/extract.js +97 -27
- package/dist/tools/extract.js.map +1 -1
- package/dist/tools/map.d.ts +40 -0
- package/dist/tools/map.d.ts.map +1 -0
- package/dist/tools/map.js +139 -0
- package/dist/tools/map.js.map +1 -0
- package/dist/tools/scrape.d.ts +33 -6
- package/dist/tools/scrape.d.ts.map +1 -1
- package/dist/tools/scrape.js +57 -8
- package/dist/tools/scrape.js.map +1 -1
- package/dist/tools/search.d.ts +40 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +147 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/types.d.ts +189 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -3
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/server.json +9 -12
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.crawlCancelDescription = exports.crawlCancelSchema = exports.crawlStatusDescription = exports.crawlStatusSchema = exports.crawlDescription = exports.crawlSchema = void 0;
|
|
4
|
+
exports.handleCrawl = handleCrawl;
|
|
5
|
+
exports.handleCrawlStatus = handleCrawlStatus;
|
|
6
|
+
exports.handleCrawlCancel = handleCrawlCancel;
|
|
7
|
+
const zod_1 = require("zod");
|
|
8
|
+
const errors_js_1 = require("../errors.js");
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Start Crawl
|
|
11
|
+
// ============================================================================
|
|
12
|
+
exports.crawlSchema = zod_1.z.object({
|
|
13
|
+
url: zod_1.z.string().url().describe("Start URL for the crawl"),
|
|
14
|
+
max_pages: zod_1.z
|
|
15
|
+
.number()
|
|
16
|
+
.int()
|
|
17
|
+
.min(1)
|
|
18
|
+
.max(100000)
|
|
19
|
+
.default(50)
|
|
20
|
+
.describe("Maximum number of pages to scrape"),
|
|
21
|
+
max_depth: zod_1.z
|
|
22
|
+
.number()
|
|
23
|
+
.int()
|
|
24
|
+
.min(0)
|
|
25
|
+
.max(20)
|
|
26
|
+
.default(3)
|
|
27
|
+
.describe("Maximum link-following depth from start URL (0 = start page only)"),
|
|
28
|
+
include_patterns: zod_1.z
|
|
29
|
+
.array(zod_1.z.string())
|
|
30
|
+
.optional()
|
|
31
|
+
.describe("Glob patterns — only scrape URLs whose path matches at least one (e.g., ['/blog/*', '/docs/*'])"),
|
|
32
|
+
exclude_patterns: zod_1.z
|
|
33
|
+
.array(zod_1.z.string())
|
|
34
|
+
.optional()
|
|
35
|
+
.describe("Glob patterns — skip URLs whose path matches any (e.g., ['/tag/*', '/author/*'])"),
|
|
36
|
+
sitemap: zod_1.z
|
|
37
|
+
.enum(["include", "skip", "only"])
|
|
38
|
+
.default("include")
|
|
39
|
+
.describe("Sitemap mode: include (default), skip (link extraction only), only (sitemap URLs only)"),
|
|
40
|
+
formats: zod_1.z
|
|
41
|
+
.array(zod_1.z.enum(["text", "json", "json_v2", "html", "markdown"]))
|
|
42
|
+
.optional()
|
|
43
|
+
.describe("Output formats for each scraped page"),
|
|
44
|
+
extraction_schema: zod_1.z
|
|
45
|
+
.record(zod_1.z.unknown())
|
|
46
|
+
.optional()
|
|
47
|
+
.describe("JSON schema for structured extraction on each page"),
|
|
48
|
+
render_js: zod_1.z
|
|
49
|
+
.union([zod_1.z.boolean(), zod_1.z.literal("auto")])
|
|
50
|
+
.default(false)
|
|
51
|
+
.describe("Render JavaScript on crawled pages. true=always (Tier 4), false=never, auto=smart detection per page"),
|
|
52
|
+
use_proxy: zod_1.z
|
|
53
|
+
.boolean()
|
|
54
|
+
.default(false)
|
|
55
|
+
.describe("Route all crawl requests through premium proxy"),
|
|
56
|
+
max_concurrency: zod_1.z
|
|
57
|
+
.number()
|
|
58
|
+
.int()
|
|
59
|
+
.min(1)
|
|
60
|
+
.max(50)
|
|
61
|
+
.default(10)
|
|
62
|
+
.describe("Maximum concurrent pages to scrape simultaneously"),
|
|
63
|
+
respect_robots: zod_1.z
|
|
64
|
+
.boolean()
|
|
65
|
+
.default(true)
|
|
66
|
+
.describe("Respect robots.txt rules for the target domain"),
|
|
67
|
+
include_subdomains: zod_1.z
|
|
68
|
+
.boolean()
|
|
69
|
+
.default(false)
|
|
70
|
+
.describe("Include links to subdomains during discovery"),
|
|
71
|
+
webhook_url: zod_1.z
|
|
72
|
+
.string()
|
|
73
|
+
.url()
|
|
74
|
+
.optional()
|
|
75
|
+
.describe("Webhook URL to notify on crawl completion"),
|
|
76
|
+
});
|
|
77
|
+
exports.crawlDescription = "Start an asynchronous crawl of an entire website. " +
|
|
78
|
+
"Discovers URLs via sitemap parsing and link extraction, then scrapes each page. " +
|
|
79
|
+
"Returns a crawl_id immediately — use alterlab_crawl_status to poll results. " +
|
|
80
|
+
"Use include_patterns/exclude_patterns to scope the crawl to specific sections. " +
|
|
81
|
+
"Use render_js='auto' for mixed sites to save 30-60% vs always rendering. " +
|
|
82
|
+
"Supports extraction_schema to extract structured data from every page.";
|
|
83
|
+
async function handleCrawl(client, params) {
|
|
84
|
+
try {
|
|
85
|
+
const response = await client.startCrawl({
|
|
86
|
+
url: params.url,
|
|
87
|
+
max_pages: params.max_pages,
|
|
88
|
+
max_depth: params.max_depth,
|
|
89
|
+
include_patterns: params.include_patterns,
|
|
90
|
+
exclude_patterns: params.exclude_patterns,
|
|
91
|
+
sitemap: params.sitemap,
|
|
92
|
+
formats: params.formats,
|
|
93
|
+
extraction_schema: params.extraction_schema,
|
|
94
|
+
max_concurrency: params.max_concurrency,
|
|
95
|
+
respect_robots: params.respect_robots,
|
|
96
|
+
include_subdomains: params.include_subdomains,
|
|
97
|
+
webhook_url: params.webhook_url,
|
|
98
|
+
advanced: {
|
|
99
|
+
render_js: params.render_js,
|
|
100
|
+
use_proxy: params.use_proxy,
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
const text = `**Crawl Started**\n\n` +
|
|
104
|
+
`- Crawl ID: \`${response.crawl_id}\`\n` +
|
|
105
|
+
`- Status: ${response.status}\n` +
|
|
106
|
+
`- Start URL: ${response.url}\n` +
|
|
107
|
+
`- Max pages: ${params.max_pages}\n` +
|
|
108
|
+
`- Max depth: ${params.max_depth}\n\n` +
|
|
109
|
+
`Use \`alterlab_crawl_status\` with crawl_id \`${response.crawl_id}\` to poll for results.\n` +
|
|
110
|
+
`Crawls run asynchronously — check back after a few minutes for large sites.`;
|
|
111
|
+
return { content: [{ type: "text", text }] };
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (isApiError(error)) {
|
|
115
|
+
return (0, errors_js_1.formatErrorResult)(error, { url: params.url });
|
|
116
|
+
}
|
|
117
|
+
return (0, errors_js_1.formatErrorResult)(error, { url: params.url });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// ============================================================================
|
|
121
|
+
// Crawl Status (poll)
|
|
122
|
+
// ============================================================================
|
|
123
|
+
exports.crawlStatusSchema = zod_1.z.object({
|
|
124
|
+
crawl_id: zod_1.z.string().describe("Crawl ID returned by alterlab_crawl"),
|
|
125
|
+
});
|
|
126
|
+
exports.crawlStatusDescription = "Poll the status and results of an ongoing or completed crawl. " +
|
|
127
|
+
"Call this after alterlab_crawl to check progress and retrieve scraped pages. " +
|
|
128
|
+
"Status values: queued, running, completed, failed, cancelled. " +
|
|
129
|
+
"When completed, results contains the scraped page content.";
|
|
130
|
+
async function handleCrawlStatus(client, params) {
|
|
131
|
+
try {
|
|
132
|
+
const response = await client.getCrawlStatus(params.crawl_id);
|
|
133
|
+
const text = formatCrawlStatusResponse(response);
|
|
134
|
+
return { content: [{ type: "text", text }] };
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (isApiError(error)) {
|
|
138
|
+
return (0, errors_js_1.formatErrorResult)(error, { url: params.crawl_id });
|
|
139
|
+
}
|
|
140
|
+
return (0, errors_js_1.formatErrorResult)(error, { url: params.crawl_id });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// ============================================================================
|
|
144
|
+
// Cancel Crawl
|
|
145
|
+
// ============================================================================
|
|
146
|
+
exports.crawlCancelSchema = zod_1.z.object({
|
|
147
|
+
crawl_id: zod_1.z.string().describe("Crawl ID to cancel"),
|
|
148
|
+
});
|
|
149
|
+
exports.crawlCancelDescription = "Cancel an ongoing crawl and refund unused pre-debited credits. " +
|
|
150
|
+
"Already-scraped pages are kept and available via alterlab_crawl_status. " +
|
|
151
|
+
"Cancelled crawls cannot be resumed.";
|
|
152
|
+
async function handleCrawlCancel(client, params) {
|
|
153
|
+
try {
|
|
154
|
+
const response = await client.cancelCrawl(params.crawl_id);
|
|
155
|
+
const text = `**Crawl Cancelled**\n\n` +
|
|
156
|
+
`- Crawl ID: \`${params.crawl_id}\`\n` +
|
|
157
|
+
`- Pages scraped before cancel: ${response.pages_scraped ?? "unknown"}\n` +
|
|
158
|
+
`- Credits refunded: ${response.credits_refunded ?? 0}\n\n` +
|
|
159
|
+
`Any pages scraped before cancellation are still available via \`alterlab_crawl_status\`.`;
|
|
160
|
+
return { content: [{ type: "text", text }] };
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
if (isApiError(error)) {
|
|
164
|
+
return (0, errors_js_1.formatErrorResult)(error, { url: params.crawl_id });
|
|
165
|
+
}
|
|
166
|
+
return (0, errors_js_1.formatErrorResult)(error, { url: params.crawl_id });
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// ============================================================================
|
|
170
|
+
// Helpers
|
|
171
|
+
// ============================================================================
|
|
172
|
+
function formatCrawlStatusResponse(response) {
|
|
173
|
+
const r = response;
|
|
174
|
+
const status = String(r.status ?? "unknown");
|
|
175
|
+
const crawlId = String(r.crawl_id ?? "");
|
|
176
|
+
const url = String(r.url ?? "");
|
|
177
|
+
const pagesScraped = Number(r.pages_scraped ?? 0);
|
|
178
|
+
const pagesTotal = r.pages_total ? Number(r.pages_total) : null;
|
|
179
|
+
const creditsUsed = r.credits_used ? Number(r.credits_used) : null;
|
|
180
|
+
const results = Array.isArray(r.results) ? r.results : [];
|
|
181
|
+
const parts = [
|
|
182
|
+
`**Crawl Status: ${status.toUpperCase()}**\n`,
|
|
183
|
+
`- Crawl ID: \`${crawlId}\``,
|
|
184
|
+
`- URL: ${url}`,
|
|
185
|
+
`- Pages scraped: ${pagesScraped}${pagesTotal ? ` / ${pagesTotal}` : ""}`,
|
|
186
|
+
];
|
|
187
|
+
if (creditsUsed !== null) {
|
|
188
|
+
parts.push(`- Credits used: ${creditsUsed}`);
|
|
189
|
+
}
|
|
190
|
+
if (status === "running" || status === "queued") {
|
|
191
|
+
parts.push("\nCrawl is still in progress. Poll again with `alterlab_crawl_status` to check for updates.");
|
|
192
|
+
}
|
|
193
|
+
else if (status === "completed") {
|
|
194
|
+
parts.push(`\n**Results** (${results.length} pages):\n`);
|
|
195
|
+
const preview = results.slice(0, 10);
|
|
196
|
+
for (const page of preview) {
|
|
197
|
+
const p = page;
|
|
198
|
+
const pageUrl = String(p.url ?? "");
|
|
199
|
+
const pageStatus = String(p.status ?? "");
|
|
200
|
+
const title = p.title ? ` — ${String(p.title)}` : "";
|
|
201
|
+
parts.push(`- [${pageStatus}] ${pageUrl}${title}`);
|
|
202
|
+
}
|
|
203
|
+
if (results.length > 10) {
|
|
204
|
+
parts.push(`... and ${results.length - 10} more pages`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else if (status === "failed") {
|
|
208
|
+
const error = r.error ? String(r.error) : "Unknown error";
|
|
209
|
+
parts.push(`\n**Error**: ${error}`);
|
|
210
|
+
}
|
|
211
|
+
return parts.join("\n");
|
|
212
|
+
}
|
|
213
|
+
function isApiError(error) {
|
|
214
|
+
return (typeof error === "object" &&
|
|
215
|
+
error !== null &&
|
|
216
|
+
"status" in error &&
|
|
217
|
+
typeof error.status === "number");
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=crawl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawl.js","sourceRoot":"","sources":["../../src/tools/crawl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"estimate.d.ts","sourceRoot":"","sources":["../../src/tools/estimate.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,cAAc;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"estimate.d.ts","sourceRoot":"","sources":["../../src/tools/estimate.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,cAAc;;;;;;;;;;;;;;;EAgBzB,CAAC;AAEH,eAAO,MAAM,mBAAmB,QAG6B,CAAC;AAE9D,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,GACrC,OAAO,CAAC,cAAc,CAAC,CAmBzB"}
|
package/dist/tools/estimate.js
CHANGED
|
@@ -14,7 +14,7 @@ exports.estimateSchema = zod_1.z.object({
|
|
|
14
14
|
render_js: zod_1.z
|
|
15
15
|
.boolean()
|
|
16
16
|
.default(false)
|
|
17
|
-
.describe("
|
|
17
|
+
.describe("Enable JS rendering (forces Tier 4 minimum — no separate add-on charge)"),
|
|
18
18
|
use_proxy: zod_1.z
|
|
19
19
|
.boolean()
|
|
20
20
|
.default(false)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"estimate.js","sourceRoot":"","sources":["../../src/tools/estimate.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"estimate.js","sourceRoot":"","sources":["../../src/tools/estimate.ts"],"names":[],"mappings":";;;AA6BA,wCAsBC;AAnDD,6BAAwB;AAGxB,4CAAgE;AAChE,4CAAsD;AAEzC,QAAA,cAAc,GAAG,OAAC,CAAC,MAAM,CAAC;IACrC,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IACnE,IAAI,EAAE,OAAC;SACJ,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC1C,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,eAAe,CAAC;IAC5B,SAAS,EAAE,OAAC;SACT,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CACP,yEAAyE,CAC1E;IACH,SAAS,EAAE,OAAC;SACT,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,wCAAwC,CAAC;CACtD,CAAC,CAAC;AAEU,QAAA,mBAAmB,GAC9B,oEAAoE;IACpE,sEAAsE;IACtE,2DAA2D,CAAC;AAEvD,KAAK,UAAU,cAAc,CAClC,MAAsB,EACtB,MAAsC;IAEtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACrC,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE;gBACR,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B;SACF,CAAC,CAAC;QACH,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAA,kCAAsB,EAAC,QAAQ,CAAC,EAAE,CAAC;SACpE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,IAAA,6BAAiB,EAAC,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,IAAA,6BAAiB,EAAC,KAAc,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,QAAQ,IAAI,KAAK;QACjB,OAAQ,KAAkB,CAAC,MAAM,KAAK,QAAQ,CAC/C,CAAC;AACJ,CAAC"}
|
package/dist/tools/extract.d.ts
CHANGED
|
@@ -2,26 +2,32 @@ import { z } from "zod";
|
|
|
2
2
|
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
3
3
|
import type { AlterLabClient } from "../client.js";
|
|
4
4
|
export declare const extractSchema: z.ZodObject<{
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
content: z.ZodString;
|
|
6
|
+
content_type: z.ZodDefault<z.ZodEnum<["html", "text", "markdown"]>>;
|
|
7
|
+
extraction_profile: z.ZodOptional<z.ZodEnum<["auto", "product", "article", "job_posting", "faq", "recipe", "event"]>>;
|
|
7
8
|
extraction_schema: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
8
9
|
extraction_prompt: z.ZodOptional<z.ZodString>;
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
formats: z.ZodDefault<z.ZodArray<z.ZodEnum<["text", "json", "json_v2", "html", "markdown", "rag"]>, "many">>;
|
|
11
|
+
source_url: z.ZodOptional<z.ZodString>;
|
|
12
|
+
evidence: z.ZodDefault<z.ZodBoolean>;
|
|
11
13
|
}, "strip", z.ZodTypeAny, {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
content: string;
|
|
15
|
+
formats: ("text" | "html" | "json" | "json_v2" | "markdown" | "rag")[];
|
|
16
|
+
content_type: "text" | "html" | "markdown";
|
|
17
|
+
evidence: boolean;
|
|
18
|
+
extraction_profile?: "auto" | "product" | "article" | "job_posting" | "faq" | "recipe" | "event" | undefined;
|
|
16
19
|
extraction_schema?: Record<string, unknown> | undefined;
|
|
17
20
|
extraction_prompt?: string | undefined;
|
|
21
|
+
source_url?: string | undefined;
|
|
18
22
|
}, {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
23
|
+
content: string;
|
|
24
|
+
formats?: ("text" | "html" | "json" | "json_v2" | "markdown" | "rag")[] | undefined;
|
|
25
|
+
content_type?: "text" | "html" | "markdown" | undefined;
|
|
22
26
|
extraction_profile?: "auto" | "product" | "article" | "job_posting" | "faq" | "recipe" | "event" | undefined;
|
|
23
27
|
extraction_schema?: Record<string, unknown> | undefined;
|
|
24
28
|
extraction_prompt?: string | undefined;
|
|
29
|
+
source_url?: string | undefined;
|
|
30
|
+
evidence?: boolean | undefined;
|
|
25
31
|
}>;
|
|
26
32
|
export declare const extractDescription: string;
|
|
27
33
|
export declare function handleExtract(client: AlterLabClient, params: z.infer<typeof extractSchema>): Promise<CallToolResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/tools/extract.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;
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/tools/extract.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,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8DxB,CAAC;AAEH,eAAO,MAAM,kBAAkB,QAO4D,CAAC;AAE5F,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,GACpC,OAAO,CAAC,cAAc,CAAC,CAyBzB"}
|
package/dist/tools/extract.js
CHANGED
|
@@ -4,60 +4,130 @@ exports.extractDescription = exports.extractSchema = void 0;
|
|
|
4
4
|
exports.handleExtract = handleExtract;
|
|
5
5
|
const zod_1 = require("zod");
|
|
6
6
|
const errors_js_1 = require("../errors.js");
|
|
7
|
-
const format_js_1 = require("../format.js");
|
|
8
7
|
exports.extractSchema = zod_1.z.object({
|
|
9
|
-
|
|
8
|
+
content: zod_1.z
|
|
9
|
+
.string()
|
|
10
|
+
.min(1)
|
|
11
|
+
.describe("Raw content to extract from — HTML, text, or markdown. " +
|
|
12
|
+
"Bring your own pre-fetched content; this endpoint does NOT scrape a URL."),
|
|
13
|
+
content_type: zod_1.z
|
|
14
|
+
.enum(["html", "text", "markdown"])
|
|
15
|
+
.default("html")
|
|
16
|
+
.describe("Type of the provided content"),
|
|
10
17
|
extraction_profile: zod_1.z
|
|
11
|
-
.enum([
|
|
12
|
-
|
|
18
|
+
.enum([
|
|
19
|
+
"auto",
|
|
20
|
+
"product",
|
|
21
|
+
"article",
|
|
22
|
+
"job_posting",
|
|
23
|
+
"faq",
|
|
24
|
+
"recipe",
|
|
25
|
+
"event",
|
|
26
|
+
])
|
|
27
|
+
.optional()
|
|
13
28
|
.describe("Pre-defined extraction profile. 'product' extracts price/title/reviews, " +
|
|
14
29
|
"'article' extracts title/author/body, etc. 'auto' detects the page type"),
|
|
15
30
|
extraction_schema: zod_1.z
|
|
16
31
|
.record(zod_1.z.unknown())
|
|
17
32
|
.optional()
|
|
18
|
-
.describe("Custom JSON Schema for extraction. Fields are mapped from
|
|
33
|
+
.describe("Custom JSON Schema for extraction. Fields are mapped from content. " +
|
|
19
34
|
"Overrides extraction_profile when provided"),
|
|
20
35
|
extraction_prompt: zod_1.z
|
|
21
36
|
.string()
|
|
37
|
+
.max(2000)
|
|
22
38
|
.optional()
|
|
23
|
-
.describe("Natural language instructions for extraction (e.g., 'Extract all product prices and ratings')"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
.
|
|
27
|
-
.
|
|
28
|
-
|
|
39
|
+
.describe("Natural language instructions for LLM extraction (e.g., 'Extract all product prices and ratings'). " +
|
|
40
|
+
"Charged at LLM extraction rate when provided."),
|
|
41
|
+
formats: zod_1.z
|
|
42
|
+
.array(zod_1.z.enum(["text", "json", "json_v2", "html", "markdown", "rag"]))
|
|
43
|
+
.default(["json"])
|
|
44
|
+
.describe("Output formats for content transformation. 'json' is best for structured extraction."),
|
|
45
|
+
source_url: zod_1.z
|
|
46
|
+
.string()
|
|
47
|
+
.max(2048)
|
|
48
|
+
.optional()
|
|
49
|
+
.describe("Original URL of the content (for context only — not fetched). " +
|
|
50
|
+
"Helps the extractor understand the content's domain."),
|
|
51
|
+
evidence: zod_1.z
|
|
29
52
|
.boolean()
|
|
30
53
|
.default(false)
|
|
31
|
-
.describe("
|
|
54
|
+
.describe("Include field provenance/evidence for extracted fields (which part of the content each field came from)"),
|
|
32
55
|
});
|
|
33
|
-
exports.extractDescription = "Extract structured data from
|
|
56
|
+
exports.extractDescription = "Extract structured data from raw HTML, text, or markdown content WITHOUT scraping. " +
|
|
57
|
+
"Bring your own pre-fetched content. Use this when you already have the page content " +
|
|
58
|
+
"and want to run AlterLab's extraction pipeline on it. " +
|
|
59
|
+
"For scraping + extraction in one step, use alterlab_scrape with formats=['json'] instead. " +
|
|
34
60
|
"Profiles: 'product' (price, title, reviews), 'article' (title, author, body), " +
|
|
35
61
|
"'job_posting', 'faq', 'recipe', 'event'. " +
|
|
36
|
-
"Returns JSON data. Use extraction_prompt for natural language extraction
|
|
62
|
+
"Returns JSON data. Use extraction_prompt for natural language extraction (LLM-powered).";
|
|
37
63
|
async function handleExtract(client, params) {
|
|
38
64
|
try {
|
|
39
|
-
const response = await client.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
sync: true,
|
|
65
|
+
const response = await client.extract({
|
|
66
|
+
content: params.content,
|
|
67
|
+
content_type: params.content_type,
|
|
43
68
|
extraction_profile: params.extraction_profile,
|
|
44
69
|
extraction_schema: params.extraction_schema,
|
|
45
70
|
extraction_prompt: params.extraction_prompt,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
},
|
|
71
|
+
formats: params.formats,
|
|
72
|
+
source_url: params.source_url,
|
|
73
|
+
evidence: params.evidence,
|
|
50
74
|
});
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
};
|
|
75
|
+
const text = formatStandaloneExtractResponse(response, params.source_url);
|
|
76
|
+
return { content: [{ type: "text", text }] };
|
|
54
77
|
}
|
|
55
78
|
catch (error) {
|
|
56
79
|
if (isApiError(error)) {
|
|
57
|
-
return (0, errors_js_1.formatErrorResult)(error, {
|
|
80
|
+
return (0, errors_js_1.formatErrorResult)(error, {
|
|
81
|
+
url: params.source_url ?? "raw content",
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return (0, errors_js_1.formatErrorResult)(error, {
|
|
85
|
+
url: params.source_url ?? "raw content",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function formatStandaloneExtractResponse(response, sourceUrl) {
|
|
90
|
+
const r = response;
|
|
91
|
+
const extractId = String(r.extract_id ?? "");
|
|
92
|
+
const creditsUsed = Number(r.credits_used ?? 0);
|
|
93
|
+
const extractionMethod = String(r.extraction_method ?? "algorithmic");
|
|
94
|
+
const modelUsed = r.model_used ? String(r.model_used) : null;
|
|
95
|
+
const formats = r.formats;
|
|
96
|
+
const parts = [];
|
|
97
|
+
if (sourceUrl) {
|
|
98
|
+
parts.push(`# Extracted: ${sourceUrl}\n`);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
parts.push(`# Extraction Result\n`);
|
|
102
|
+
}
|
|
103
|
+
if (formats) {
|
|
104
|
+
// Prefer json output, then fall through to other formats
|
|
105
|
+
const jsonData = formats.json || formats.json_v2;
|
|
106
|
+
const markdown = formats.markdown;
|
|
107
|
+
const text = formats.text;
|
|
108
|
+
if (jsonData) {
|
|
109
|
+
parts.push("```json\n" +
|
|
110
|
+
(typeof jsonData === "string"
|
|
111
|
+
? jsonData
|
|
112
|
+
: JSON.stringify(jsonData, null, 2)) +
|
|
113
|
+
"\n```");
|
|
114
|
+
}
|
|
115
|
+
else if (markdown) {
|
|
116
|
+
parts.push(markdown);
|
|
117
|
+
}
|
|
118
|
+
else if (text) {
|
|
119
|
+
parts.push(text);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
parts.push("```json\n" + JSON.stringify(formats, null, 2) + "\n```");
|
|
58
123
|
}
|
|
59
|
-
return (0, errors_js_1.formatErrorResult)(error, { url: params.url });
|
|
60
124
|
}
|
|
125
|
+
parts.push("\n---\n" +
|
|
126
|
+
`Extract ID: \`${extractId}\` | ` +
|
|
127
|
+
`Method: ${extractionMethod}` +
|
|
128
|
+
(modelUsed ? ` (${modelUsed})` : "") +
|
|
129
|
+
` | Credits: ${creditsUsed}`);
|
|
130
|
+
return parts.join("\n");
|
|
61
131
|
}
|
|
62
132
|
function isApiError(error) {
|
|
63
133
|
return (typeof error === "object" &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/tools/extract.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/tools/extract.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 mapSchema: z.ZodObject<{
|
|
5
|
+
url: z.ZodString;
|
|
6
|
+
max_pages: z.ZodDefault<z.ZodNumber>;
|
|
7
|
+
max_depth: z.ZodDefault<z.ZodNumber>;
|
|
8
|
+
include_patterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
9
|
+
exclude_patterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
10
|
+
search: z.ZodOptional<z.ZodString>;
|
|
11
|
+
sitemap: z.ZodDefault<z.ZodEnum<["skip", "include", "only"]>>;
|
|
12
|
+
include_metadata: z.ZodDefault<z.ZodBoolean>;
|
|
13
|
+
include_subdomains: z.ZodDefault<z.ZodBoolean>;
|
|
14
|
+
respect_robots: z.ZodDefault<z.ZodBoolean>;
|
|
15
|
+
}, "strip", z.ZodTypeAny, {
|
|
16
|
+
url: string;
|
|
17
|
+
max_pages: number;
|
|
18
|
+
max_depth: number;
|
|
19
|
+
sitemap: "include" | "skip" | "only";
|
|
20
|
+
respect_robots: boolean;
|
|
21
|
+
include_subdomains: boolean;
|
|
22
|
+
include_metadata: boolean;
|
|
23
|
+
include_patterns?: string[] | undefined;
|
|
24
|
+
exclude_patterns?: string[] | undefined;
|
|
25
|
+
search?: string | undefined;
|
|
26
|
+
}, {
|
|
27
|
+
url: string;
|
|
28
|
+
max_pages?: number | undefined;
|
|
29
|
+
max_depth?: number | undefined;
|
|
30
|
+
include_patterns?: string[] | undefined;
|
|
31
|
+
exclude_patterns?: string[] | undefined;
|
|
32
|
+
sitemap?: "include" | "skip" | "only" | undefined;
|
|
33
|
+
respect_robots?: boolean | undefined;
|
|
34
|
+
include_subdomains?: boolean | undefined;
|
|
35
|
+
search?: string | undefined;
|
|
36
|
+
include_metadata?: boolean | undefined;
|
|
37
|
+
}>;
|
|
38
|
+
export declare const mapDescription: string;
|
|
39
|
+
export declare function handleMap(client: AlterLabClient, params: z.infer<typeof mapSchema>): Promise<CallToolResult>;
|
|
40
|
+
//# sourceMappingURL=map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/tools/map.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,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuDpB,CAAC;AAEH,eAAO,MAAM,cAAc,QAO8C,CAAC;AAE1E,wBAAsB,SAAS,CAC7B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,GAChC,OAAO,CAAC,cAAc,CAAC,CAuBzB"}
|