@ignidor/web-search-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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AA4BA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC1C,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACpC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACpC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACpC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAsB,SAAQ,UAAU;IACvD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IACzC,UAAU,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
package/dist/index.js ADDED
@@ -0,0 +1,561 @@
1
+ #!/usr/bin/env node
2
+ // @ignidor/web-search-mcp - Free, Unlimited Web Search with BM25 Ranking and Playwright
3
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
4
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
6
+ import { performSearch } from './search.js';
7
+ import { BM25Ranker, HybridRanker } from './ranking.js';
8
+ import { crawlWithPlaywright, captureScreenshot, generatePDF, executeJS, extractStructured, extractRegex } from './playwright-crawler.js';
9
+ import { isValidQuery, clamp } from './utils/validators.js';
10
+ import { processBatchWithErrorHandling } from './utils/concurrency.js';
11
+ // ============================================================================
12
+ // MCP Server
13
+ // ============================================================================
14
+ class WebSearchServer {
15
+ server;
16
+ constructor() {
17
+ this.server = new Server({
18
+ name: '@ignidor/web-search-mcp',
19
+ version: '1.0.0',
20
+ }, {
21
+ capabilities: {
22
+ tools: {},
23
+ },
24
+ });
25
+ this.setupToolHandlers();
26
+ this.server.onerror = (error) => console.error('[MCP Error]', error);
27
+ process.on('SIGINT', async () => {
28
+ await this.server.close();
29
+ process.exit(0);
30
+ });
31
+ }
32
+ setupToolHandlers() {
33
+ // ------------------------------------------------------------
34
+ // Tool 1: search - Fast ranked discovery
35
+ // ------------------------------------------------------------
36
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
37
+ tools: [
38
+ {
39
+ name: 'search',
40
+ description: 'Search the web with intelligent BM25 ranking. Free, unlimited, no API key needed.',
41
+ inputSchema: {
42
+ type: 'object',
43
+ properties: {
44
+ query: {
45
+ type: 'string',
46
+ description: 'Search query',
47
+ },
48
+ limit: {
49
+ type: 'number',
50
+ description: 'Max results (1-50, default 10)',
51
+ minimum: 1,
52
+ maximum: 50,
53
+ },
54
+ rankingMode: {
55
+ type: 'string',
56
+ enum: ['bm25', 'hybrid'],
57
+ description: 'Ranking mode: bm25 (fast) or hybrid (with freshness/domain scores)',
58
+ },
59
+ },
60
+ required: ['query'],
61
+ },
62
+ },
63
+ {
64
+ name: 'crawl_and_extract',
65
+ description: 'Extract full content from URLs using Playwright. Returns markdown content with no Docker required.',
66
+ inputSchema: {
67
+ type: 'object',
68
+ properties: {
69
+ urls: {
70
+ type: 'array',
71
+ items: { type: 'string' },
72
+ description: 'URLs to extract content from',
73
+ },
74
+ extractDepth: {
75
+ type: 'string',
76
+ enum: ['basic', 'advanced'],
77
+ description: 'Extraction depth (default: basic)',
78
+ },
79
+ },
80
+ required: ['urls'],
81
+ },
82
+ },
83
+ {
84
+ name: 'search_and_crawl',
85
+ description: 'Search AND extract full content from top results. Best for deep research.',
86
+ inputSchema: {
87
+ type: 'object',
88
+ properties: {
89
+ query: {
90
+ type: 'string',
91
+ description: 'Search query',
92
+ },
93
+ extractTopN: {
94
+ type: 'number',
95
+ description: 'Number of top results to extract (1-10, default 5)',
96
+ minimum: 1,
97
+ maximum: 10,
98
+ },
99
+ rerankAfterExtract: {
100
+ type: 'boolean',
101
+ description: 'Re-rank based on full extracted content (default: true)',
102
+ },
103
+ },
104
+ required: ['query'],
105
+ },
106
+ },
107
+ {
108
+ name: 'capture_screenshot',
109
+ description: 'Capture a screenshot of a webpage. Returns base64 image or saves to file.',
110
+ inputSchema: {
111
+ type: 'object',
112
+ properties: {
113
+ url: {
114
+ type: 'string',
115
+ description: 'URL to screenshot',
116
+ },
117
+ waitFor: {
118
+ type: 'number',
119
+ description: 'Seconds to wait before capturing (default: 2)',
120
+ minimum: 0,
121
+ maximum: 30,
122
+ },
123
+ },
124
+ required: ['url'],
125
+ },
126
+ },
127
+ {
128
+ name: 'generate_pdf',
129
+ description: 'Generate a PDF from a webpage. Returns base64 PDF data.',
130
+ inputSchema: {
131
+ type: 'object',
132
+ properties: {
133
+ url: {
134
+ type: 'string',
135
+ description: 'URL to convert to PDF',
136
+ },
137
+ },
138
+ required: ['url'],
139
+ },
140
+ },
141
+ {
142
+ name: 'extract_structured',
143
+ description: 'Extract structured data using CSS selectors. Perfect for scraping product listings, articles, etc.',
144
+ inputSchema: {
145
+ type: 'object',
146
+ properties: {
147
+ url: {
148
+ type: 'string',
149
+ description: 'URL to scrape',
150
+ },
151
+ baseSelector: {
152
+ type: 'string',
153
+ description: 'CSS selector for the base element (e.g., ".product", "article")',
154
+ },
155
+ fields: {
156
+ type: 'array',
157
+ items: {
158
+ type: 'object',
159
+ properties: {
160
+ name: { type: 'string' },
161
+ selector: { type: 'string' },
162
+ type: { type: 'string', enum: ['text', 'html', 'attribute'] },
163
+ attribute: { type: 'string' }
164
+ },
165
+ required: ['name', 'selector', 'type']
166
+ },
167
+ description: 'Fields to extract (e.g., [{name:"title",selector:"h2",type:"text"}])',
168
+ },
169
+ },
170
+ required: ['url', 'baseSelector', 'fields'],
171
+ },
172
+ },
173
+ {
174
+ name: 'execute_js',
175
+ description: 'Execute custom JavaScript on a webpage and get results. Great for dynamic content.',
176
+ inputSchema: {
177
+ type: 'object',
178
+ properties: {
179
+ url: {
180
+ type: 'string',
181
+ description: 'URL to execute JS on',
182
+ },
183
+ scripts: {
184
+ type: 'array',
185
+ items: { type: 'string' },
186
+ description: 'JavaScript code to execute (e.g., ["return document.title", "return document.links.length"])',
187
+ },
188
+ },
189
+ required: ['url', 'scripts'],
190
+ },
191
+ },
192
+ {
193
+ name: 'extract_regex',
194
+ description: 'Extract data using regex patterns. Supports emails, phones, URLs, currencies, dates, and custom patterns.',
195
+ inputSchema: {
196
+ type: 'object',
197
+ properties: {
198
+ url: {
199
+ type: 'string',
200
+ description: 'URL to extract from',
201
+ },
202
+ patterns: {
203
+ type: 'array',
204
+ items: {
205
+ type: 'string',
206
+ enum: ['email', 'phone_intl', 'phone_us', 'url', 'ipv4', 'ipv6', 'uuid', 'currency', 'percentage', 'number', 'date_iso', 'date_us', 'time_24h', 'postal_us', 'postal_uk', 'hex_color', 'twitter_handle', 'hashtag', 'mac_addr', 'iban', 'credit_card', 'all']
207
+ },
208
+ description: 'Built-in patterns to extract',
209
+ },
210
+ customPatterns: {
211
+ type: 'object',
212
+ description: 'Custom regex patterns as {"name": "pattern"}',
213
+ },
214
+ },
215
+ required: ['url'],
216
+ },
217
+ },
218
+ ],
219
+ }));
220
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
221
+ const { name, arguments: args } = request.params;
222
+ try {
223
+ switch (name) {
224
+ case 'search':
225
+ return await this.handleSearch(args);
226
+ case 'crawl_and_extract':
227
+ return await this.handleCrawlAndExtract(args);
228
+ case 'search_and_crawl':
229
+ return await this.handleSearchAndCrawl(args);
230
+ case 'capture_screenshot':
231
+ return await this.handleCaptureScreenshot(args);
232
+ case 'generate_pdf':
233
+ return await this.handleGeneratePDF(args);
234
+ case 'extract_structured':
235
+ return await this.handleExtractStructured(args);
236
+ case 'execute_js':
237
+ return await this.handleExecuteJS(args);
238
+ case 'extract_regex':
239
+ return await this.handleExtractRegex(args);
240
+ default:
241
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
242
+ }
243
+ }
244
+ catch (error) {
245
+ if (error instanceof McpError)
246
+ throw error;
247
+ return {
248
+ content: [
249
+ {
250
+ type: 'text',
251
+ text: `Error: ${error instanceof Error ? error.message : String(error)}`,
252
+ },
253
+ ],
254
+ isError: true,
255
+ };
256
+ }
257
+ });
258
+ }
259
+ // ========================================================================
260
+ // Tool Handlers
261
+ // ========================================================================
262
+ async handleSearch(args) {
263
+ // Validate query
264
+ const validation = isValidQuery(args.query);
265
+ if (!validation.valid) {
266
+ throw new McpError(ErrorCode.InvalidParams, validation.error);
267
+ }
268
+ const query = args.query.trim();
269
+ const limit = clamp(args.limit || 10, 1, 50);
270
+ const rankingMode = args.rankingMode || 'bm25';
271
+ console.error(`[MCP] Searching: "${query}" (limit: ${limit}, ranking: ${rankingMode})`);
272
+ // Perform search
273
+ const response = await performSearch(query, limit);
274
+ if (!response.hasResults) {
275
+ return {
276
+ content: [
277
+ {
278
+ type: 'text',
279
+ text: `No results found for "${query}". Try a different query.`,
280
+ },
281
+ ],
282
+ };
283
+ }
284
+ // Rank results
285
+ let rankedResults;
286
+ if (rankingMode === 'hybrid') {
287
+ const ranker = new HybridRanker();
288
+ rankedResults = ranker.rankSearchResults(query, response.results);
289
+ }
290
+ else {
291
+ const ranker = new BM25Ranker();
292
+ rankedResults = ranker.rankSearchResults(query, response.results);
293
+ }
294
+ // Format output
295
+ const formatted = rankedResults.map((r, i) => {
296
+ let output = `#${r.position}. ${r.title}\n`;
297
+ output += `URL: ${r.url}\n`;
298
+ output += `Score: ${r.score.toFixed(3)} | Domain: ${r.domain}\n`;
299
+ output += `\n${r.snippet}\n`;
300
+ return output;
301
+ }).join('\n---\n\n');
302
+ return {
303
+ content: [
304
+ {
305
+ type: 'text',
306
+ text: `Found ${rankedResults.length} results for "${query}" (via ${response.provider})\n\n${formatted}`,
307
+ },
308
+ ],
309
+ };
310
+ }
311
+ async handleCrawlAndExtract(args) {
312
+ const { urls, extractDepth = 'basic', timeout = 30000, includeImages = false } = args;
313
+ if (!Array.isArray(urls) || urls.length === 0) {
314
+ throw new McpError(ErrorCode.InvalidParams, 'urls must be a non-empty array');
315
+ }
316
+ console.error(`[MCP] Extracting ${urls.length} URLs (depth: ${extractDepth}) using Playwright`);
317
+ // Use Playwright directly (no Docker needed!)
318
+ const results = await processBatchWithErrorHandling(urls, (url) => crawlWithPlaywright(url, { timeout, includeImages }), 3);
319
+ // Format results
320
+ let output = '';
321
+ let successCount = 0;
322
+ urls.forEach((url, i) => {
323
+ const result = results[i];
324
+ output += `\n[${i + 1}] ${url}\n`;
325
+ if (result && result.success) {
326
+ successCount++;
327
+ output += ` ✅ Success (${result.wordCount || 0} words, ${result.durationMs || 0}ms)\n`;
328
+ if (result.title)
329
+ output += ` Title: ${result.title}\n`;
330
+ if (result.markdown) {
331
+ output += `\n${result.markdown.substring(0, 500)}${result.markdown.length > 500 ? '...' : ''}\n`;
332
+ }
333
+ }
334
+ else {
335
+ output += ` ❌ Failed: ${result?.error || 'Unknown error'}\n`;
336
+ }
337
+ output += '\n';
338
+ });
339
+ const summary = `\n📊 Summary: ${successCount}/${urls.length} succeeded\n`;
340
+ return {
341
+ content: [
342
+ {
343
+ type: 'text',
344
+ text: summary + output,
345
+ },
346
+ ],
347
+ };
348
+ }
349
+ async handleSearchAndCrawl(args) {
350
+ const { query, extractTopN = 5, rerankAfterExtract = true } = args;
351
+ // Validate query
352
+ const validation = isValidQuery(query);
353
+ if (!validation.valid) {
354
+ throw new McpError(ErrorCode.InvalidParams, validation.error);
355
+ }
356
+ const topN = clamp(extractTopN, 1, 10);
357
+ console.error(`[MCP] Search & Crawl: "${query}" (extracting top ${topN})`);
358
+ // Step 1: Search
359
+ const searchResponse = await performSearch(query, 20);
360
+ if (!searchResponse.hasResults) {
361
+ return {
362
+ content: [
363
+ {
364
+ type: 'text',
365
+ text: `No results found for "${query}"`,
366
+ },
367
+ ],
368
+ };
369
+ }
370
+ // Step 2: Rank initial results
371
+ const ranker = new BM25Ranker();
372
+ let rankedResults = ranker.rankSearchResults(query, searchResponse.results);
373
+ // Step 3: Extract top N using Playwright (no Docker!)
374
+ const topUrls = rankedResults.slice(0, topN).map(r => r.url);
375
+ let extractedContent = new Map();
376
+ const crawlResults = await processBatchWithErrorHandling(topUrls, (url) => crawlWithPlaywright(url, { timeout: 30000 }), 3);
377
+ crawlResults.forEach((result) => {
378
+ if (result && result.success && result.markdown && result.url) {
379
+ extractedContent.set(result.url, result.markdown);
380
+ }
381
+ });
382
+ // Step 4: Re-rank with full content if requested
383
+ if (rerankAfterExtract && extractedContent.size > 0) {
384
+ const { rerankWithFullContent } = await import('./ranking.js');
385
+ rankedResults = rerankWithFullContent(query, rankedResults, extractedContent);
386
+ }
387
+ // Format output
388
+ let output = `🔍 Search Results for "${query}"\n\n`;
389
+ rankedResults.slice(0, topN).forEach((r) => {
390
+ output += `## ${r.position}. ${r.title}\n`;
391
+ output += `**Score:** ${r.score.toFixed(3)} | **Provider:** ${r.provider}\n`;
392
+ output += `**URL:** ${r.url}\n\n`;
393
+ const fullContent = extractedContent.get(r.url);
394
+ if (fullContent) {
395
+ output += `**Full Content (${fullContent.split(/\s+/).length} words):**\n\n`;
396
+ output += fullContent.substring(0, 1000);
397
+ if (fullContent.length > 1000)
398
+ output += '...\n';
399
+ }
400
+ else {
401
+ output += `**Snippet:** ${r.snippet}\n`;
402
+ }
403
+ output += '\n---\n\n';
404
+ });
405
+ return {
406
+ content: [
407
+ {
408
+ type: 'text',
409
+ text: output,
410
+ },
411
+ ],
412
+ };
413
+ }
414
+ async handleCaptureScreenshot(args) {
415
+ const { url, waitFor = 2 } = args;
416
+ const result = await captureScreenshot(url, { waitFor });
417
+ if (result.success && result.base64) {
418
+ return {
419
+ content: [
420
+ {
421
+ type: 'text',
422
+ text: `📸 Screenshot captured (base64 length: ${result.base64.length} chars)\n\nFirst 100 chars: ${result.base64.substring(0, 100)}...`,
423
+ },
424
+ {
425
+ type: 'image',
426
+ data: result.base64,
427
+ mimeType: 'image/png'
428
+ }
429
+ ],
430
+ };
431
+ }
432
+ return {
433
+ content: [
434
+ {
435
+ type: 'text',
436
+ text: result.success ? `✅ ${result.path || 'Screenshot saved'}` : `❌ Error: ${result.error}`,
437
+ },
438
+ ],
439
+ isError: !result.success,
440
+ };
441
+ }
442
+ async handleGeneratePDF(args) {
443
+ const { url } = args;
444
+ const result = await generatePDF(url);
445
+ if (result.success && result.base64) {
446
+ return {
447
+ content: [
448
+ {
449
+ type: 'text',
450
+ text: `📄 PDF generated (base64 length: ${result.base64.length} chars)\n\nTo save: copy and decode base64 to .pdf file`,
451
+ },
452
+ ],
453
+ };
454
+ }
455
+ return {
456
+ content: [
457
+ {
458
+ type: 'text',
459
+ text: result.success ? `✅ ${result.path || 'PDF generated'}` : `❌ Error: ${result.error}`,
460
+ },
461
+ ],
462
+ isError: !result.success,
463
+ };
464
+ }
465
+ async handleExtractStructured(args) {
466
+ const { url, baseSelector, fields } = args;
467
+ const result = await extractStructured(url, baseSelector, fields);
468
+ if (result.success && result.data) {
469
+ return {
470
+ content: [
471
+ {
472
+ type: 'text',
473
+ text: `✅ Extracted ${result.data.length} items:\n\`\`\`json\n${JSON.stringify(result.data, null, 2)}\n\`\`\``,
474
+ },
475
+ ],
476
+ };
477
+ }
478
+ return {
479
+ content: [
480
+ {
481
+ type: 'text',
482
+ text: `❌ Error: ${result.error || 'Failed to extract'}`,
483
+ },
484
+ ],
485
+ isError: true,
486
+ };
487
+ }
488
+ async handleExecuteJS(args) {
489
+ const { url, scripts } = args;
490
+ const result = await executeJS(url, scripts);
491
+ if (result.success && result.results) {
492
+ const output = result.results.map((r, i) => `Script ${i + 1} result:\n\`\`\`\n${JSON.stringify(r, null, 2)}\n\`\`\``).join('\n\n');
493
+ return {
494
+ content: [
495
+ {
496
+ type: 'text',
497
+ text: `✅ JavaScript executed successfully:\n\n${output}`,
498
+ },
499
+ ],
500
+ };
501
+ }
502
+ return {
503
+ content: [
504
+ {
505
+ type: 'text',
506
+ text: `❌ Error: ${result.error || 'Execution failed'}`,
507
+ },
508
+ ],
509
+ isError: true,
510
+ };
511
+ }
512
+ async handleExtractRegex(args) {
513
+ const { url, patterns = ['all'], customPatterns } = args;
514
+ const result = await extractRegex(url, patterns, customPatterns);
515
+ if (result.success && result.matches) {
516
+ let output = `🎯 Regex Extraction Results\n\n`;
517
+ for (const [pattern, matches] of Object.entries(result.matches)) {
518
+ output += `**${pattern}**: ${matches.length} match${matches.length !== 1 ? 'es' : ''}\n`;
519
+ if (matches.length <= 10) {
520
+ matches.slice(0, 10).forEach(m => output += ` - ${m}\n`);
521
+ }
522
+ else {
523
+ matches.slice(0, 10).forEach(m => output += ` - ${m}\n`);
524
+ output += ` ... and ${matches.length - 10} more\n`;
525
+ }
526
+ output += '\n';
527
+ }
528
+ return {
529
+ content: [
530
+ {
531
+ type: 'text',
532
+ text: output.trim(),
533
+ },
534
+ ],
535
+ };
536
+ }
537
+ return {
538
+ content: [
539
+ {
540
+ type: 'text',
541
+ text: `❌ Error: ${result.error || 'Extraction failed'}`,
542
+ },
543
+ ],
544
+ isError: true,
545
+ };
546
+ }
547
+ // ========================================================================
548
+ // Run Server
549
+ // ========================================================================
550
+ async run() {
551
+ const transport = new StdioServerTransport();
552
+ await this.server.connect(transport);
553
+ console.error('@ignidor/web-search-mcp server running');
554
+ }
555
+ }
556
+ // ============================================================================
557
+ // Start Server
558
+ // ============================================================================
559
+ const server = new WebSearchServer();
560
+ server.run().catch(console.error);
561
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}