nodebench-mcp 1.0.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/README.md +237 -0
- package/dist/__tests__/tools.test.d.ts +1 -0
- package/dist/__tests__/tools.test.js +402 -0
- package/dist/__tests__/tools.test.js.map +1 -0
- package/dist/db.d.ts +4 -0
- package/dist/db.js +198 -0
- package/dist/db.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +237 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/documentTools.d.ts +5 -0
- package/dist/tools/documentTools.js +524 -0
- package/dist/tools/documentTools.js.map +1 -0
- package/dist/tools/documentationTools.d.ts +12 -0
- package/dist/tools/documentationTools.js +647 -0
- package/dist/tools/documentationTools.js.map +1 -0
- package/dist/tools/evalTools.d.ts +6 -0
- package/dist/tools/evalTools.js +335 -0
- package/dist/tools/evalTools.js.map +1 -0
- package/dist/tools/financialTools.d.ts +10 -0
- package/dist/tools/financialTools.js +403 -0
- package/dist/tools/financialTools.js.map +1 -0
- package/dist/tools/flywheelTools.d.ts +6 -0
- package/dist/tools/flywheelTools.js +366 -0
- package/dist/tools/flywheelTools.js.map +1 -0
- package/dist/tools/githubTools.d.ts +12 -0
- package/dist/tools/githubTools.js +432 -0
- package/dist/tools/githubTools.js.map +1 -0
- package/dist/tools/learningTools.d.ts +6 -0
- package/dist/tools/learningTools.js +199 -0
- package/dist/tools/learningTools.js.map +1 -0
- package/dist/tools/memoryTools.d.ts +5 -0
- package/dist/tools/memoryTools.js +137 -0
- package/dist/tools/memoryTools.js.map +1 -0
- package/dist/tools/metaTools.d.ts +7 -0
- package/dist/tools/metaTools.js +837 -0
- package/dist/tools/metaTools.js.map +1 -0
- package/dist/tools/planningTools.d.ts +5 -0
- package/dist/tools/planningTools.js +147 -0
- package/dist/tools/planningTools.js.map +1 -0
- package/dist/tools/qualityGateTools.d.ts +6 -0
- package/dist/tools/qualityGateTools.js +347 -0
- package/dist/tools/qualityGateTools.js.map +1 -0
- package/dist/tools/reconTools.d.ts +8 -0
- package/dist/tools/reconTools.js +729 -0
- package/dist/tools/reconTools.js.map +1 -0
- package/dist/tools/searchTools.d.ts +5 -0
- package/dist/tools/searchTools.js +145 -0
- package/dist/tools/searchTools.js.map +1 -0
- package/dist/tools/uiCaptureTools.d.ts +8 -0
- package/dist/tools/uiCaptureTools.js +339 -0
- package/dist/tools/uiCaptureTools.js.map +1 -0
- package/dist/tools/verificationTools.d.ts +6 -0
- package/dist/tools/verificationTools.js +472 -0
- package/dist/tools/verificationTools.js.map +1 -0
- package/dist/tools/visionTools.d.ts +12 -0
- package/dist/tools/visionTools.js +553 -0
- package/dist/tools/visionTools.js.map +1 -0
- package/dist/tools/webTools.d.ts +12 -0
- package/dist/tools/webTools.js +443 -0
- package/dist/tools/webTools.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web tools — URL fetching and web search capabilities.
|
|
3
|
+
* Enables agents to gather information from the web for research, ideation, and discovery.
|
|
4
|
+
*
|
|
5
|
+
* - web_search: Searches the web using AI providers with search grounding
|
|
6
|
+
* - fetch_url: Fetches a URL and extracts content as markdown/text/html
|
|
7
|
+
*
|
|
8
|
+
* Uses Gemini grounding (preferred), OpenAI web search, or Perplexity as providers.
|
|
9
|
+
* Cheerio is optional for HTML parsing.
|
|
10
|
+
*/
|
|
11
|
+
// ─── Dynamic import helpers ───────────────────────────────────────────────────
|
|
12
|
+
async function canImport(pkg) {
|
|
13
|
+
try {
|
|
14
|
+
await import(pkg);
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async function getCheerio() {
|
|
22
|
+
try {
|
|
23
|
+
const mod = await import("cheerio");
|
|
24
|
+
// cheerio exports load() directly, not as default
|
|
25
|
+
return mod;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// ─── HTML to Markdown conversion ─────────────────────────────────────────────
|
|
32
|
+
function htmlToMarkdown(html, cheerio) {
|
|
33
|
+
const $ = cheerio.load(html);
|
|
34
|
+
// Remove script, style, nav, footer, header (keep main content)
|
|
35
|
+
$("script, style, nav, footer, header, aside, .ad, .advertisement, [role='navigation']").remove();
|
|
36
|
+
// Try to find main content area
|
|
37
|
+
let content = $("main, article, [role='main'], .content, .post-content, .article-content").first();
|
|
38
|
+
if (content.length === 0) {
|
|
39
|
+
content = $("body");
|
|
40
|
+
}
|
|
41
|
+
const lines = [];
|
|
42
|
+
// Extract text with structure
|
|
43
|
+
content.find("h1, h2, h3, h4, h5, h6, p, li, td, th, pre, code, blockquote").each((_, el) => {
|
|
44
|
+
const tag = el.tagName?.toLowerCase() ?? "";
|
|
45
|
+
const text = $(el).text().trim();
|
|
46
|
+
if (!text)
|
|
47
|
+
return;
|
|
48
|
+
switch (tag) {
|
|
49
|
+
case "h1":
|
|
50
|
+
lines.push(`\n# ${text}\n`);
|
|
51
|
+
break;
|
|
52
|
+
case "h2":
|
|
53
|
+
lines.push(`\n## ${text}\n`);
|
|
54
|
+
break;
|
|
55
|
+
case "h3":
|
|
56
|
+
lines.push(`\n### ${text}\n`);
|
|
57
|
+
break;
|
|
58
|
+
case "h4":
|
|
59
|
+
lines.push(`\n#### ${text}\n`);
|
|
60
|
+
break;
|
|
61
|
+
case "h5":
|
|
62
|
+
case "h6":
|
|
63
|
+
lines.push(`\n**${text}**\n`);
|
|
64
|
+
break;
|
|
65
|
+
case "p":
|
|
66
|
+
lines.push(`${text}\n`);
|
|
67
|
+
break;
|
|
68
|
+
case "li":
|
|
69
|
+
lines.push(`- ${text}`);
|
|
70
|
+
break;
|
|
71
|
+
case "pre":
|
|
72
|
+
case "code":
|
|
73
|
+
lines.push(`\`\`\`\n${text}\n\`\`\`\n`);
|
|
74
|
+
break;
|
|
75
|
+
case "blockquote":
|
|
76
|
+
lines.push(`> ${text}\n`);
|
|
77
|
+
break;
|
|
78
|
+
case "td":
|
|
79
|
+
case "th":
|
|
80
|
+
// Tables are complex, just capture cell content
|
|
81
|
+
lines.push(text);
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
// Clean up result
|
|
86
|
+
let result = lines.join("\n");
|
|
87
|
+
// Remove excessive newlines
|
|
88
|
+
result = result.replace(/\n{3,}/g, "\n\n");
|
|
89
|
+
// Trim leading/trailing whitespace
|
|
90
|
+
result = result.trim();
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
function basicHtmlToText(html) {
|
|
94
|
+
// Fallback when cheerio not available - basic regex extraction
|
|
95
|
+
return html
|
|
96
|
+
.replace(/<script[\s\S]*?<\/script>/gi, "")
|
|
97
|
+
.replace(/<style[\s\S]*?<\/style>/gi, "")
|
|
98
|
+
.replace(/<[^>]+>/g, " ")
|
|
99
|
+
.replace(/\s+/g, " ")
|
|
100
|
+
.trim();
|
|
101
|
+
}
|
|
102
|
+
async function searchWithGemini(query, maxResults) {
|
|
103
|
+
const { GoogleGenAI } = await import("@google/genai");
|
|
104
|
+
const apiKey = process.env.GEMINI_API_KEY || process.env.GOOGLE_AI_API_KEY || "";
|
|
105
|
+
const ai = new GoogleGenAI({ apiKey });
|
|
106
|
+
// Use Gemini with Google Search grounding
|
|
107
|
+
const response = await ai.models.generateContent({
|
|
108
|
+
model: "gemini-2.5-flash",
|
|
109
|
+
contents: [
|
|
110
|
+
{
|
|
111
|
+
role: "user",
|
|
112
|
+
parts: [
|
|
113
|
+
{
|
|
114
|
+
text: `Search the web for: "${query}"
|
|
115
|
+
|
|
116
|
+
Return the top ${maxResults} most relevant results. For each result, provide:
|
|
117
|
+
1. Title
|
|
118
|
+
2. URL
|
|
119
|
+
3. A 1-2 sentence snippet summarizing the content
|
|
120
|
+
|
|
121
|
+
Format your response as JSON array:
|
|
122
|
+
[{"title": "...", "url": "...", "snippet": "..."}]
|
|
123
|
+
|
|
124
|
+
Only return the JSON array, no other text.`,
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
config: {
|
|
130
|
+
tools: [{ googleSearch: {} }],
|
|
131
|
+
maxOutputTokens: 2048,
|
|
132
|
+
temperature: 0.1,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
// Parse response
|
|
136
|
+
const text = response?.candidates?.[0]?.content?.parts?.[0]?.text ?? "[]";
|
|
137
|
+
const jsonMatch = text.match(/\[[\s\S]*\]/);
|
|
138
|
+
if (!jsonMatch)
|
|
139
|
+
return [];
|
|
140
|
+
try {
|
|
141
|
+
const results = JSON.parse(jsonMatch[0]);
|
|
142
|
+
return results.map((r) => ({
|
|
143
|
+
title: r.title || "",
|
|
144
|
+
url: r.url || "",
|
|
145
|
+
snippet: r.snippet || "",
|
|
146
|
+
source: "gemini",
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async function searchWithOpenAI(query, maxResults) {
|
|
154
|
+
const OpenAI = (await import("openai")).default;
|
|
155
|
+
const client = new OpenAI();
|
|
156
|
+
// Use OpenAI with web search preview (responses API)
|
|
157
|
+
try {
|
|
158
|
+
const response = await client.responses.create({
|
|
159
|
+
model: "gpt-4o",
|
|
160
|
+
tools: [{ type: "web_search_preview" }],
|
|
161
|
+
input: `Search for: "${query}". Return the top ${maxResults} most relevant results as JSON array with title, url, snippet fields.`,
|
|
162
|
+
});
|
|
163
|
+
const text = response?.output_text ?? "[]";
|
|
164
|
+
const jsonMatch = text.match(/\[[\s\S]*\]/);
|
|
165
|
+
if (!jsonMatch)
|
|
166
|
+
return [];
|
|
167
|
+
const results = JSON.parse(jsonMatch[0]);
|
|
168
|
+
return results.map((r) => ({
|
|
169
|
+
title: r.title || "",
|
|
170
|
+
url: r.url || "",
|
|
171
|
+
snippet: r.snippet || "",
|
|
172
|
+
source: "openai",
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// Fall back to standard chat if responses API not available
|
|
177
|
+
const response = await client.chat.completions.create({
|
|
178
|
+
model: "gpt-4o",
|
|
179
|
+
messages: [
|
|
180
|
+
{
|
|
181
|
+
role: "system",
|
|
182
|
+
content: "You are a search assistant. Based on your knowledge, provide relevant results for the query.",
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
role: "user",
|
|
186
|
+
content: `Search for: "${query}". Return ${maxResults} relevant results as JSON array: [{"title": "...", "url": "...", "snippet": "..."}]`,
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
max_tokens: 2048,
|
|
190
|
+
});
|
|
191
|
+
const text = response.choices[0]?.message?.content ?? "[]";
|
|
192
|
+
const jsonMatch = text.match(/\[[\s\S]*\]/);
|
|
193
|
+
if (!jsonMatch)
|
|
194
|
+
return [];
|
|
195
|
+
const results = JSON.parse(jsonMatch[0]);
|
|
196
|
+
return results.map((r) => ({
|
|
197
|
+
title: r.title || "",
|
|
198
|
+
url: r.url || "",
|
|
199
|
+
snippet: r.snippet || "",
|
|
200
|
+
source: "openai_knowledge",
|
|
201
|
+
}));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async function searchWithPerplexity(query, maxResults) {
|
|
205
|
+
// Perplexity uses OpenAI-compatible API
|
|
206
|
+
const OpenAI = (await import("openai")).default;
|
|
207
|
+
const client = new OpenAI({
|
|
208
|
+
apiKey: process.env.PERPLEXITY_API_KEY,
|
|
209
|
+
baseURL: "https://api.perplexity.ai",
|
|
210
|
+
});
|
|
211
|
+
const response = await client.chat.completions.create({
|
|
212
|
+
model: "llama-3.1-sonar-large-128k-online",
|
|
213
|
+
messages: [
|
|
214
|
+
{
|
|
215
|
+
role: "system",
|
|
216
|
+
content: "Be precise and concise. Return results as JSON.",
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
role: "user",
|
|
220
|
+
content: `Search for: "${query}". Return the top ${maxResults} results as JSON array: [{"title": "...", "url": "...", "snippet": "..."}]`,
|
|
221
|
+
},
|
|
222
|
+
],
|
|
223
|
+
max_tokens: 2048,
|
|
224
|
+
});
|
|
225
|
+
const text = response.choices[0]?.message?.content ?? "[]";
|
|
226
|
+
const jsonMatch = text.match(/\[[\s\S]*\]/);
|
|
227
|
+
if (!jsonMatch)
|
|
228
|
+
return [];
|
|
229
|
+
try {
|
|
230
|
+
const results = JSON.parse(jsonMatch[0]);
|
|
231
|
+
return results.map((r) => ({
|
|
232
|
+
title: r.title || "",
|
|
233
|
+
url: r.url || "",
|
|
234
|
+
snippet: r.snippet || "",
|
|
235
|
+
source: "perplexity",
|
|
236
|
+
}));
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return [];
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// ─── Tools ────────────────────────────────────────────────────────────────────
|
|
243
|
+
export const webTools = [
|
|
244
|
+
{
|
|
245
|
+
name: "web_search",
|
|
246
|
+
description: "Search the web using AI providers with search grounding. Returns structured search results with titles, URLs, and snippets. Auto-selects best provider: Gemini (Google Search grounding) > OpenAI (web search preview) > Perplexity. Use for research, market analysis, tech discovery, and gathering current information.",
|
|
247
|
+
inputSchema: {
|
|
248
|
+
type: "object",
|
|
249
|
+
properties: {
|
|
250
|
+
query: {
|
|
251
|
+
type: "string",
|
|
252
|
+
description: "The search query (e.g., 'TypeScript MCP servers 2026', 'AI agent frameworks comparison')",
|
|
253
|
+
},
|
|
254
|
+
maxResults: {
|
|
255
|
+
type: "number",
|
|
256
|
+
description: "Maximum number of results to return (default: 5, max: 20)",
|
|
257
|
+
},
|
|
258
|
+
provider: {
|
|
259
|
+
type: "string",
|
|
260
|
+
enum: ["auto", "gemini", "openai", "perplexity"],
|
|
261
|
+
description: "Which search provider to use. Default: 'auto' (selects best available).",
|
|
262
|
+
},
|
|
263
|
+
},
|
|
264
|
+
required: ["query"],
|
|
265
|
+
},
|
|
266
|
+
handler: async (args) => {
|
|
267
|
+
const query = args.query;
|
|
268
|
+
const maxResults = Math.min(args.maxResults ?? 5, 20);
|
|
269
|
+
const providerChoice = args.provider ?? "auto";
|
|
270
|
+
let selectedProvider = null;
|
|
271
|
+
if (providerChoice !== "auto") {
|
|
272
|
+
selectedProvider = providerChoice;
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
// Auto-select: Gemini > OpenAI > Perplexity
|
|
276
|
+
if ((process.env.GEMINI_API_KEY || process.env.GOOGLE_AI_API_KEY) &&
|
|
277
|
+
(await canImport("@google/genai"))) {
|
|
278
|
+
selectedProvider = "gemini";
|
|
279
|
+
}
|
|
280
|
+
else if (process.env.OPENAI_API_KEY && (await canImport("openai"))) {
|
|
281
|
+
selectedProvider = "openai";
|
|
282
|
+
}
|
|
283
|
+
else if (process.env.PERPLEXITY_API_KEY && (await canImport("openai"))) {
|
|
284
|
+
selectedProvider = "perplexity";
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
if (!selectedProvider) {
|
|
288
|
+
return {
|
|
289
|
+
error: true,
|
|
290
|
+
query,
|
|
291
|
+
message: "No search provider available.",
|
|
292
|
+
suggestion: "Set one of: GEMINI_API_KEY (recommended for Google Search grounding), OPENAI_API_KEY, or PERPLEXITY_API_KEY. Install SDK: @google/genai or openai.",
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
try {
|
|
296
|
+
let results;
|
|
297
|
+
switch (selectedProvider) {
|
|
298
|
+
case "gemini":
|
|
299
|
+
results = await searchWithGemini(query, maxResults);
|
|
300
|
+
break;
|
|
301
|
+
case "openai":
|
|
302
|
+
results = await searchWithOpenAI(query, maxResults);
|
|
303
|
+
break;
|
|
304
|
+
case "perplexity":
|
|
305
|
+
results = await searchWithPerplexity(query, maxResults);
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
query,
|
|
310
|
+
results,
|
|
311
|
+
provider: selectedProvider,
|
|
312
|
+
resultCount: results.length,
|
|
313
|
+
searchedAt: new Date().toISOString(),
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
catch (err) {
|
|
317
|
+
return {
|
|
318
|
+
error: true,
|
|
319
|
+
query,
|
|
320
|
+
provider: selectedProvider,
|
|
321
|
+
message: `Search failed: ${err.message}`,
|
|
322
|
+
suggestion: "Check that the API key is valid. Try a different provider.",
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
name: "fetch_url",
|
|
329
|
+
description: "Fetch a URL and extract its content as markdown, text, or raw HTML. Useful for reading documentation, blog posts, API references, and web pages. Uses cheerio for HTML parsing when available, with fallback to basic text extraction.",
|
|
330
|
+
inputSchema: {
|
|
331
|
+
type: "object",
|
|
332
|
+
properties: {
|
|
333
|
+
url: {
|
|
334
|
+
type: "string",
|
|
335
|
+
description: "The URL to fetch (e.g., 'https://docs.example.com/getting-started')",
|
|
336
|
+
},
|
|
337
|
+
extractMode: {
|
|
338
|
+
type: "string",
|
|
339
|
+
enum: ["markdown", "text", "html"],
|
|
340
|
+
description: "How to extract content: 'markdown' (structured), 'text' (plain), 'html' (raw). Default: 'markdown'.",
|
|
341
|
+
},
|
|
342
|
+
maxLength: {
|
|
343
|
+
type: "number",
|
|
344
|
+
description: "Maximum content length to return (default: 50000 characters)",
|
|
345
|
+
},
|
|
346
|
+
},
|
|
347
|
+
required: ["url"],
|
|
348
|
+
},
|
|
349
|
+
handler: async (args) => {
|
|
350
|
+
const url = args.url;
|
|
351
|
+
const extractMode = args.extractMode ?? "markdown";
|
|
352
|
+
const maxLength = args.maxLength ?? 50000;
|
|
353
|
+
// Validate URL
|
|
354
|
+
let parsedUrl;
|
|
355
|
+
try {
|
|
356
|
+
parsedUrl = new URL(url);
|
|
357
|
+
}
|
|
358
|
+
catch {
|
|
359
|
+
return {
|
|
360
|
+
error: true,
|
|
361
|
+
url,
|
|
362
|
+
message: "Invalid URL format",
|
|
363
|
+
suggestion: "Provide a valid URL starting with http:// or https://",
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
try {
|
|
367
|
+
const response = await fetch(url, {
|
|
368
|
+
headers: {
|
|
369
|
+
"User-Agent": "Mozilla/5.0 (compatible; NodeBench-MCP/1.0; +https://github.com/nodebench)",
|
|
370
|
+
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
371
|
+
},
|
|
372
|
+
redirect: "follow",
|
|
373
|
+
});
|
|
374
|
+
if (!response.ok) {
|
|
375
|
+
return {
|
|
376
|
+
error: true,
|
|
377
|
+
url,
|
|
378
|
+
status: response.status,
|
|
379
|
+
message: `HTTP ${response.status}: ${response.statusText}`,
|
|
380
|
+
suggestion: "Check that the URL is accessible and not blocked.",
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
384
|
+
const html = await response.text();
|
|
385
|
+
// Extract title from HTML
|
|
386
|
+
const titleMatch = html.match(/<title[^>]*>([^<]*)<\/title>/i);
|
|
387
|
+
const title = titleMatch?.[1]?.trim() ?? parsedUrl.hostname;
|
|
388
|
+
let content;
|
|
389
|
+
if (extractMode === "html") {
|
|
390
|
+
content = html;
|
|
391
|
+
}
|
|
392
|
+
else if (extractMode === "markdown") {
|
|
393
|
+
const cheerio = await getCheerio();
|
|
394
|
+
if (cheerio) {
|
|
395
|
+
content = htmlToMarkdown(html, cheerio);
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
// Fallback to text extraction
|
|
399
|
+
content = basicHtmlToText(html);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
// text mode
|
|
404
|
+
const cheerio = await getCheerio();
|
|
405
|
+
if (cheerio) {
|
|
406
|
+
const $ = cheerio.load(html);
|
|
407
|
+
$("script, style").remove();
|
|
408
|
+
content = $("body").text().replace(/\s+/g, " ").trim();
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
content = basicHtmlToText(html);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
// Truncate if needed
|
|
415
|
+
const truncated = content.length > maxLength;
|
|
416
|
+
if (truncated) {
|
|
417
|
+
content = content.slice(0, maxLength) + "\n\n... [truncated]";
|
|
418
|
+
}
|
|
419
|
+
return {
|
|
420
|
+
url,
|
|
421
|
+
finalUrl: response.url, // After redirects
|
|
422
|
+
title,
|
|
423
|
+
contentType,
|
|
424
|
+
extractMode,
|
|
425
|
+
content,
|
|
426
|
+
contentLength: content.length,
|
|
427
|
+
truncated,
|
|
428
|
+
fetchedAt: new Date().toISOString(),
|
|
429
|
+
cheerioAvailable: !!(await getCheerio()),
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
catch (err) {
|
|
433
|
+
return {
|
|
434
|
+
error: true,
|
|
435
|
+
url,
|
|
436
|
+
message: `Fetch failed: ${err.message}`,
|
|
437
|
+
suggestion: "Check network connectivity and that the URL is accessible.",
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
},
|
|
441
|
+
},
|
|
442
|
+
];
|
|
443
|
+
//# sourceMappingURL=webTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webTools.js","sourceRoot":"","sources":["../../src/tools/webTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,iFAAiF;AAEjF,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACpC,kDAAkD;QAClD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,SAAS,cAAc,CAAC,IAAY,EAAE,OAAY;IAChD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7B,gEAAgE;IAChE,CAAC,CAAC,qFAAqF,CAAC,CAAC,MAAM,EAAE,CAAC;IAElG,gCAAgC;IAChC,IAAI,OAAO,GAAG,CAAC,CAAC,yEAAyE,CAAC,CAAC,KAAK,EAAE,CAAC;IACnG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,8BAA8B;IAC9B,OAAO,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAO,EAAE,EAAE;QACpG,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAEjC,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,IAAI;gBACP,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;gBAC5B,MAAM;YACR,KAAK,IAAI;gBACP,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;gBAC7B,MAAM;YACR,KAAK,IAAI;gBACP,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;gBAC9B,MAAM;YACR,KAAK,IAAI;gBACP,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;gBAC/B,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,IAAI;gBACP,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;gBAC9B,MAAM;YACR,KAAK,GAAG;gBACN,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;gBACxB,MAAM;YACR,KAAK,IAAI;gBACP,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBACxB,MAAM;YACR,KAAK,KAAK,CAAC;YACX,KAAK,MAAM;gBACT,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,YAAY,CAAC,CAAC;gBACxC,MAAM;YACR,KAAK,YAAY;gBACf,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;gBAC1B,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,IAAI;gBACP,gDAAgD;gBAChD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,MAAM;QACV,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAClB,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,4BAA4B;IAC5B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3C,mCAAmC;IACnC,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAEvB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,+DAA+D;IAC/D,OAAO,IAAI;SACR,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC;SAC1C,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC;SACxC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAWD,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,UAAkB;IAC/D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IACjF,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvC,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC;QAC/C,KAAK,EAAE,kBAAkB;QACzB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,wBAAwB,KAAK;;iBAE9B,UAAU;;;;;;;;2CAQgB;qBAChC;iBACF;aACF;SACF;QACD,MAAM,EAAE;YACN,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;YAC7B,eAAe,EAAE,IAAI;YACrB,WAAW,EAAE,GAAG;SACjB;KACF,CAAC,CAAC;IAEH,iBAAiB;IACjB,MAAM,IAAI,GAAI,QAAgB,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;IACnF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;YAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;YACpB,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;YAChB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACxB,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,UAAkB;IAC/D,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAE5B,qDAAqD;IACrD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAO,MAAc,CAAC,SAAS,CAAC,MAAM,CAAC;YACtD,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;YACvC,KAAK,EAAE,gBAAgB,KAAK,qBAAqB,UAAU,uEAAuE;SACnI,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,QAAQ,EAAE,WAAW,IAAI,IAAI,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;YAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;YACpB,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;YAChB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACxB,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACpD,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,8FAA8F;iBACxG;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,gBAAgB,KAAK,aAAa,UAAU,qFAAqF;iBAC3I;aACF;YACD,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;YAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;YACpB,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;YAChB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACxB,MAAM,EAAE,kBAAkB;SAC3B,CAAC,CAAC,CAAC;IACN,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,KAAa,EAAE,UAAkB;IACnE,wCAAwC;IACxC,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;QACtC,OAAO,EAAE,2BAA2B;KACrC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACpD,KAAK,EAAE,mCAAmC;QAC1C,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,iDAAiD;aAC3D;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,gBAAgB,KAAK,qBAAqB,UAAU,4EAA4E;aAC1I;SACF;QACD,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;YAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;YACpB,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;YAChB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACxB,MAAM,EAAE,YAAY;SACrB,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,MAAM,QAAQ,GAAc;IACjC;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,4TAA4T;QAC9T,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0FAA0F;iBACxG;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2DAA2D;iBACzE;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC;oBAChD,WAAW,EAAE,yEAAyE;iBACvF;aACF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACtD,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;YAI/C,IAAI,gBAAgB,GAAwB,IAAI,CAAC;YAEjD,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;gBAC9B,gBAAgB,GAAG,cAA8B,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,4CAA4C;gBAC5C,IACE,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;oBAC7D,CAAC,MAAM,SAAS,CAAC,eAAe,CAAC,CAAC,EAClC,CAAC;oBACD,gBAAgB,GAAG,QAAQ,CAAC;gBAC9B,CAAC;qBAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;oBACrE,gBAAgB,GAAG,QAAQ,CAAC;gBAC9B,CAAC;qBAAM,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;oBACzE,gBAAgB,GAAG,YAAY,CAAC;gBAClC,CAAC;YACH,CAAC;YAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,OAAO;oBACL,KAAK,EAAE,IAAI;oBACX,KAAK;oBACL,OAAO,EAAE,+BAA+B;oBACxC,UAAU,EACR,oJAAoJ;iBACvJ,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,OAAuB,CAAC;gBAE5B,QAAQ,gBAAgB,EAAE,CAAC;oBACzB,KAAK,QAAQ;wBACX,OAAO,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;wBACpD,MAAM;oBACR,KAAK,QAAQ;wBACX,OAAO,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;wBACpD,MAAM;oBACR,KAAK,YAAY;wBACf,OAAO,GAAG,MAAM,oBAAoB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;wBACxD,MAAM;gBACV,CAAC;gBAED,OAAO;oBACL,KAAK;oBACL,OAAO;oBACP,QAAQ,EAAE,gBAAgB;oBAC1B,WAAW,EAAE,OAAO,CAAC,MAAM;oBAC3B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACrC,CAAC;YACJ,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO;oBACL,KAAK,EAAE,IAAI;oBACX,KAAK;oBACL,QAAQ,EAAE,gBAAgB;oBAC1B,OAAO,EAAE,kBAAkB,GAAG,CAAC,OAAO,EAAE;oBACxC,UAAU,EAAE,4DAA4D;iBACzE,CAAC;YACJ,CAAC;QACH,CAAC;KACF;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,wOAAwO;QAC1O,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qEAAqE;iBACnF;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC;oBAClC,WAAW,EAAE,qGAAqG;iBACnH;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8DAA8D;iBAC5E;aACF;YACD,QAAQ,EAAE,CAAC,KAAK,CAAC;SAClB;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAC;YAC/B,MAAM,WAAW,GAAI,IAAI,CAAC,WAAsB,IAAI,UAAU,CAAC;YAC/D,MAAM,SAAS,GAAI,IAAI,CAAC,SAAoB,IAAI,KAAK,CAAC;YAEtD,eAAe;YACf,IAAI,SAAc,CAAC;YACnB,IAAI,CAAC;gBACH,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;oBACL,KAAK,EAAE,IAAI;oBACX,GAAG;oBACH,OAAO,EAAE,oBAAoB;oBAC7B,UAAU,EAAE,uDAAuD;iBACpE,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBAChC,OAAO,EAAE;wBACP,YAAY,EACV,4EAA4E;wBAC9E,MAAM,EAAE,iEAAiE;qBAC1E;oBACD,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,OAAO;wBACL,KAAK,EAAE,IAAI;wBACX,GAAG;wBACH,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,OAAO,EAAE,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE;wBAC1D,UAAU,EAAE,mDAAmD;qBAChE,CAAC;gBACJ,CAAC;gBAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;gBAC/D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAEnC,0BAA0B;gBAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBAC/D,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC,QAAQ,CAAC;gBAE5D,IAAI,OAAe,CAAC;gBAEpB,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;oBAC3B,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;qBAAM,IAAI,WAAW,KAAK,UAAU,EAAE,CAAC;oBACtC,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;oBACnC,IAAI,OAAO,EAAE,CAAC;wBACZ,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBAC1C,CAAC;yBAAM,CAAC;wBACN,8BAA8B;wBAC9B,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,YAAY;oBACZ,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;oBACnC,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC7B,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,CAAC;wBAC5B,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;oBACzD,CAAC;yBAAM,CAAC;wBACN,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;gBAED,qBAAqB;gBACrB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC7C,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,qBAAqB,CAAC;gBAChE,CAAC;gBAED,OAAO;oBACL,GAAG;oBACH,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,kBAAkB;oBAC1C,KAAK;oBACL,WAAW;oBACX,WAAW;oBACX,OAAO;oBACP,aAAa,EAAE,OAAO,CAAC,MAAM;oBAC7B,SAAS;oBACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,gBAAgB,EAAE,CAAC,CAAC,CAAC,MAAM,UAAU,EAAE,CAAC;iBACzC,CAAC;YACJ,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO;oBACL,KAAK,EAAE,IAAI;oBACX,GAAG;oBACH,OAAO,EAAE,iBAAiB,GAAG,CAAC,OAAO,EAAE;oBACvC,UAAU,EAAE,4DAA4D;iBACzE,CAAC;YACJ,CAAC;QACH,CAAC;KACF;CACF,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type ContentBlock = {
|
|
2
|
+
type: "text";
|
|
3
|
+
text: string;
|
|
4
|
+
} | {
|
|
5
|
+
type: "image";
|
|
6
|
+
data: string;
|
|
7
|
+
mimeType: string;
|
|
8
|
+
};
|
|
9
|
+
export type McpTool = {
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
inputSchema: Record<string, unknown>;
|
|
13
|
+
/** If true, handler returns ContentBlock[] directly instead of a JSON-serializable object. */
|
|
14
|
+
rawContent?: boolean;
|
|
15
|
+
handler: (args: any) => Promise<unknown>;
|
|
16
|
+
};
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nodebench-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "NodeBench MCP server — 46 tools for AI-powered development. Web search, GitHub discovery, vision analysis, verification flywheel.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"nodebench-mcp": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"dev": "tsx src/index.ts",
|
|
17
|
+
"test": "vitest run",
|
|
18
|
+
"test:watch": "vitest",
|
|
19
|
+
"verify": "node test-setup.mjs",
|
|
20
|
+
"prepublishOnly": "npm run build && npm run test"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"mcp",
|
|
24
|
+
"model-context-protocol",
|
|
25
|
+
"claude",
|
|
26
|
+
"ai-agents",
|
|
27
|
+
"web-search",
|
|
28
|
+
"github",
|
|
29
|
+
"vision",
|
|
30
|
+
"verification",
|
|
31
|
+
"sqlite"
|
|
32
|
+
],
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/nodebench/nodebench-ai.git",
|
|
36
|
+
"directory": "packages/mcp-local"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/nodebench/nodebench-ai/tree/main/packages/mcp-local#readme",
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/nodebench/nodebench-ai/issues"
|
|
41
|
+
},
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"author": "NodeBench",
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
46
|
+
"better-sqlite3": "^11.0.0"
|
|
47
|
+
},
|
|
48
|
+
"optionalDependencies": {
|
|
49
|
+
"playwright": "^1.57.0",
|
|
50
|
+
"sharp": "^0.34.5",
|
|
51
|
+
"@google/genai": "^1.10.0",
|
|
52
|
+
"openai": "^5.8.2",
|
|
53
|
+
"@anthropic-ai/sdk": "^0.71.2",
|
|
54
|
+
"cheerio": "^1.0.0"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@types/better-sqlite3": "^7.6.0",
|
|
58
|
+
"@types/node": "^20.11.0",
|
|
59
|
+
"tsx": "^4.7.0",
|
|
60
|
+
"typescript": "^5.3.3",
|
|
61
|
+
"vitest": "^3.2.4"
|
|
62
|
+
},
|
|
63
|
+
"engines": {
|
|
64
|
+
"node": ">=18.0.0"
|
|
65
|
+
}
|
|
66
|
+
}
|