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.
Files changed (65) hide show
  1. package/README.md +237 -0
  2. package/dist/__tests__/tools.test.d.ts +1 -0
  3. package/dist/__tests__/tools.test.js +402 -0
  4. package/dist/__tests__/tools.test.js.map +1 -0
  5. package/dist/db.d.ts +4 -0
  6. package/dist/db.js +198 -0
  7. package/dist/db.js.map +1 -0
  8. package/dist/index.d.ts +19 -0
  9. package/dist/index.js +237 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/tools/documentTools.d.ts +5 -0
  12. package/dist/tools/documentTools.js +524 -0
  13. package/dist/tools/documentTools.js.map +1 -0
  14. package/dist/tools/documentationTools.d.ts +12 -0
  15. package/dist/tools/documentationTools.js +647 -0
  16. package/dist/tools/documentationTools.js.map +1 -0
  17. package/dist/tools/evalTools.d.ts +6 -0
  18. package/dist/tools/evalTools.js +335 -0
  19. package/dist/tools/evalTools.js.map +1 -0
  20. package/dist/tools/financialTools.d.ts +10 -0
  21. package/dist/tools/financialTools.js +403 -0
  22. package/dist/tools/financialTools.js.map +1 -0
  23. package/dist/tools/flywheelTools.d.ts +6 -0
  24. package/dist/tools/flywheelTools.js +366 -0
  25. package/dist/tools/flywheelTools.js.map +1 -0
  26. package/dist/tools/githubTools.d.ts +12 -0
  27. package/dist/tools/githubTools.js +432 -0
  28. package/dist/tools/githubTools.js.map +1 -0
  29. package/dist/tools/learningTools.d.ts +6 -0
  30. package/dist/tools/learningTools.js +199 -0
  31. package/dist/tools/learningTools.js.map +1 -0
  32. package/dist/tools/memoryTools.d.ts +5 -0
  33. package/dist/tools/memoryTools.js +137 -0
  34. package/dist/tools/memoryTools.js.map +1 -0
  35. package/dist/tools/metaTools.d.ts +7 -0
  36. package/dist/tools/metaTools.js +837 -0
  37. package/dist/tools/metaTools.js.map +1 -0
  38. package/dist/tools/planningTools.d.ts +5 -0
  39. package/dist/tools/planningTools.js +147 -0
  40. package/dist/tools/planningTools.js.map +1 -0
  41. package/dist/tools/qualityGateTools.d.ts +6 -0
  42. package/dist/tools/qualityGateTools.js +347 -0
  43. package/dist/tools/qualityGateTools.js.map +1 -0
  44. package/dist/tools/reconTools.d.ts +8 -0
  45. package/dist/tools/reconTools.js +729 -0
  46. package/dist/tools/reconTools.js.map +1 -0
  47. package/dist/tools/searchTools.d.ts +5 -0
  48. package/dist/tools/searchTools.js +145 -0
  49. package/dist/tools/searchTools.js.map +1 -0
  50. package/dist/tools/uiCaptureTools.d.ts +8 -0
  51. package/dist/tools/uiCaptureTools.js +339 -0
  52. package/dist/tools/uiCaptureTools.js.map +1 -0
  53. package/dist/tools/verificationTools.d.ts +6 -0
  54. package/dist/tools/verificationTools.js +472 -0
  55. package/dist/tools/verificationTools.js.map +1 -0
  56. package/dist/tools/visionTools.d.ts +12 -0
  57. package/dist/tools/visionTools.js +553 -0
  58. package/dist/tools/visionTools.js.map +1 -0
  59. package/dist/tools/webTools.d.ts +12 -0
  60. package/dist/tools/webTools.js +443 -0
  61. package/dist/tools/webTools.js.map +1 -0
  62. package/dist/types.d.ts +16 -0
  63. package/dist/types.js +2 -0
  64. package/dist/types.js.map +1 -0
  65. 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":"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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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
+ }