research-powerpack-mcp 3.4.8 → 3.6.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/config/env.d.ts +75 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +87 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/yaml/tools-enhanced.yaml +0 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/services/llm-processor.js +0 -25
- package/dist/services/llm-processor.js.map +1 -1
- package/dist/tools/reddit.d.ts.map +1 -1
- package/dist/tools/reddit.js +76 -40
- package/dist/tools/reddit.js.map +1 -1
- package/dist/tools/research.d.ts +1 -6
- package/dist/tools/research.d.ts.map +1 -1
- package/dist/tools/research.js +63 -42
- package/dist/tools/research.js.map +1 -1
- package/dist/tools/scrape.d.ts +1 -6
- package/dist/tools/scrape.d.ts.map +1 -1
- package/dist/tools/scrape.js +53 -42
- package/dist/tools/scrape.js.map +1 -1
- package/dist/tools/search.d.ts +1 -6
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +26 -18
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/utils.d.ts +13 -0
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +17 -0
- package/dist/tools/utils.js.map +1 -1
- package/dist/utils/logger.d.ts +32 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mcp-logger.d.ts +8 -0
- package/dist/utils/mcp-logger.d.ts.map +1 -0
- package/dist/utils/mcp-logger.js +14 -0
- package/dist/utils/mcp-logger.js.map +1 -0
- package/dist/utils/response.d.ts +88 -0
- package/dist/utils/response.d.ts.map +1 -0
- package/dist/utils/response.js +151 -0
- package/dist/utils/response.js.map +1 -0
- package/package.json +1 -1
package/dist/tools/research.js
CHANGED
|
@@ -7,28 +7,10 @@ import { FileAttachmentService } from '../services/file-attachment.js';
|
|
|
7
7
|
import { RESEARCH } from '../config/index.js';
|
|
8
8
|
import { classifyError } from '../utils/errors.js';
|
|
9
9
|
import { pMap } from '../utils/concurrency.js';
|
|
10
|
+
import { mcpLog, formatSuccess, formatError, formatBatchHeader, formatDuration, truncateText, TOKEN_BUDGETS, calculateTokenAllocation, } from './utils.js';
|
|
10
11
|
// Constants
|
|
11
|
-
const TOTAL_TOKEN_BUDGET = 32000;
|
|
12
12
|
const MIN_QUESTIONS = 1; // Allow single question for flexibility
|
|
13
13
|
const MAX_QUESTIONS = 10;
|
|
14
|
-
function calculateTokenAllocation(questionCount) {
|
|
15
|
-
if (questionCount <= 0)
|
|
16
|
-
return TOTAL_TOKEN_BUDGET;
|
|
17
|
-
return Math.floor(TOTAL_TOKEN_BUDGET / questionCount);
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Safe logger wrapper - NEVER throws
|
|
21
|
-
*/
|
|
22
|
-
async function safeLog(logger, sessionId, level, message) {
|
|
23
|
-
if (!logger || !sessionId)
|
|
24
|
-
return;
|
|
25
|
-
try {
|
|
26
|
-
await logger(level, message, sessionId);
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
console.error(`[Research Tool] Logger failed: ${message}`);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
14
|
const SYSTEM_PROMPT = `You are an expert research consultant. Provide evidence-based, multi-perspective analysis.
|
|
33
15
|
|
|
34
16
|
METHODOLOGY:
|
|
@@ -49,24 +31,34 @@ Be dense with insights, light on filler. Use examples and citations.`;
|
|
|
49
31
|
* Handle deep research request
|
|
50
32
|
* NEVER throws - always returns a valid response
|
|
51
33
|
*/
|
|
52
|
-
export async function handleDeepResearch(params
|
|
53
|
-
const
|
|
34
|
+
export async function handleDeepResearch(params) {
|
|
35
|
+
const startTime = Date.now();
|
|
54
36
|
const questions = params.questions || [];
|
|
55
37
|
// Validation
|
|
56
38
|
if (questions.length < MIN_QUESTIONS) {
|
|
57
39
|
return {
|
|
58
|
-
content:
|
|
40
|
+
content: formatError({
|
|
41
|
+
code: 'MIN_QUESTIONS',
|
|
42
|
+
message: `Minimum ${MIN_QUESTIONS} research question(s) required. Received: ${questions.length}`,
|
|
43
|
+
toolName: 'deep_research',
|
|
44
|
+
howToFix: ['Add at least one question with detailed context'],
|
|
45
|
+
}),
|
|
59
46
|
structuredContent: { error: true, message: `Minimum ${MIN_QUESTIONS} question(s) required` },
|
|
60
47
|
};
|
|
61
48
|
}
|
|
62
49
|
if (questions.length > MAX_QUESTIONS) {
|
|
63
50
|
return {
|
|
64
|
-
content:
|
|
51
|
+
content: formatError({
|
|
52
|
+
code: 'MAX_QUESTIONS',
|
|
53
|
+
message: `Maximum ${MAX_QUESTIONS} research questions allowed. Received: ${questions.length}`,
|
|
54
|
+
toolName: 'deep_research',
|
|
55
|
+
howToFix: [`Remove ${questions.length - MAX_QUESTIONS} question(s)`],
|
|
56
|
+
}),
|
|
65
57
|
structuredContent: { error: true, message: `Maximum ${MAX_QUESTIONS} questions allowed` },
|
|
66
58
|
};
|
|
67
59
|
}
|
|
68
|
-
const tokensPerQuestion = calculateTokenAllocation(questions.length);
|
|
69
|
-
|
|
60
|
+
const tokensPerQuestion = calculateTokenAllocation(questions.length, TOKEN_BUDGETS.RESEARCH);
|
|
61
|
+
mcpLog('info', `Starting batch research: ${questions.length} questions, ${tokensPerQuestion.toLocaleString()} tokens/question`, 'research');
|
|
70
62
|
// Initialize client safely
|
|
71
63
|
let client;
|
|
72
64
|
try {
|
|
@@ -75,15 +67,18 @@ export async function handleDeepResearch(params, options = {}) {
|
|
|
75
67
|
catch (error) {
|
|
76
68
|
const err = classifyError(error);
|
|
77
69
|
return {
|
|
78
|
-
content:
|
|
70
|
+
content: formatError({
|
|
71
|
+
code: 'CLIENT_INIT_FAILED',
|
|
72
|
+
message: `Failed to initialize research client: ${err.message}`,
|
|
73
|
+
toolName: 'deep_research',
|
|
74
|
+
howToFix: ['Check OPENROUTER_API_KEY is set'],
|
|
75
|
+
}),
|
|
79
76
|
structuredContent: { error: true, message: `Failed to initialize: ${err.message}` },
|
|
80
77
|
};
|
|
81
78
|
}
|
|
82
79
|
const fileService = new FileAttachmentService();
|
|
83
80
|
const results = [];
|
|
84
81
|
// Process questions with bounded concurrency (max 3 concurrent LLM calls)
|
|
85
|
-
// Each research call involves web search + LLM processing, so unbounded parallelism
|
|
86
|
-
// causes CPU spikes and potential rate limiting on the LLM provider.
|
|
87
82
|
const allResults = await pMap(questions, async (q, index) => {
|
|
88
83
|
try {
|
|
89
84
|
// Enhance question with file attachments if present
|
|
@@ -95,10 +90,10 @@ export async function handleDeepResearch(params, options = {}) {
|
|
|
95
90
|
}
|
|
96
91
|
catch {
|
|
97
92
|
// If attachment processing fails, continue with original question
|
|
98
|
-
|
|
93
|
+
mcpLog('warning', `Failed to process attachments for question ${index + 1}`, 'research');
|
|
99
94
|
}
|
|
100
95
|
}
|
|
101
|
-
// ResearchClient.research()
|
|
96
|
+
// ResearchClient.research() returns error in response instead of throwing
|
|
102
97
|
const response = await client.research({
|
|
103
98
|
question: enhancedQuestion,
|
|
104
99
|
systemPrompt: SYSTEM_PROMPT,
|
|
@@ -124,7 +119,7 @@ export async function handleDeepResearch(params, options = {}) {
|
|
|
124
119
|
};
|
|
125
120
|
}
|
|
126
121
|
catch (error) {
|
|
127
|
-
//
|
|
122
|
+
// Safety net - ResearchClient should not throw
|
|
128
123
|
const structuredError = classifyError(error);
|
|
129
124
|
return {
|
|
130
125
|
question: q.question,
|
|
@@ -139,27 +134,53 @@ export async function handleDeepResearch(params, options = {}) {
|
|
|
139
134
|
const successful = results.filter(r => r.success);
|
|
140
135
|
const failed = results.filter(r => !r.success);
|
|
141
136
|
const totalTokens = successful.reduce((sum, r) => sum + (r.tokensUsed || 0), 0);
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
137
|
+
const executionTime = Date.now() - startTime;
|
|
138
|
+
// Build 70/20/10 response
|
|
139
|
+
const batchHeader = formatBatchHeader({
|
|
140
|
+
title: `Deep Research Results`,
|
|
141
|
+
totalItems: questions.length,
|
|
142
|
+
successful: successful.length,
|
|
143
|
+
failed: failed.length,
|
|
144
|
+
tokensPerItem: tokensPerQuestion,
|
|
145
|
+
extras: {
|
|
146
|
+
'Total tokens used': totalTokens.toLocaleString(),
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
// Build questions data section
|
|
150
|
+
const questionsData = [];
|
|
146
151
|
for (let i = 0; i < results.length; i++) {
|
|
147
152
|
const r = results[i];
|
|
148
|
-
|
|
153
|
+
const preview = truncateText(r.question, 100);
|
|
154
|
+
questionsData.push(`## Question ${i + 1}: ${preview}\n`);
|
|
149
155
|
if (r.success) {
|
|
150
|
-
|
|
156
|
+
questionsData.push(r.content);
|
|
151
157
|
if (r.tokensUsed) {
|
|
152
|
-
|
|
158
|
+
questionsData.push(`\n*Tokens used: ${r.tokensUsed.toLocaleString()}*`);
|
|
153
159
|
}
|
|
154
160
|
}
|
|
155
161
|
else {
|
|
156
|
-
|
|
162
|
+
questionsData.push(`**❌ Error:** ${r.error}`);
|
|
157
163
|
}
|
|
158
|
-
|
|
164
|
+
questionsData.push('\n---\n');
|
|
159
165
|
}
|
|
160
|
-
|
|
166
|
+
const nextSteps = [
|
|
167
|
+
successful.length > 0 ? 'Scrape mentioned sources: scrape_links(urls=[...extracted URLs...], use_llm=true)' : null,
|
|
168
|
+
failed.length > 0 ? 'Retry failed questions with more specific context' : null,
|
|
169
|
+
'Search Reddit for community perspective: search_reddit(queries=[...related topics...])',
|
|
170
|
+
].filter(Boolean);
|
|
171
|
+
const formattedContent = formatSuccess({
|
|
172
|
+
title: `Research Complete (${successful.length}/${questions.length})`,
|
|
173
|
+
summary: batchHeader,
|
|
174
|
+
data: questionsData.join('\n'),
|
|
175
|
+
nextSteps,
|
|
176
|
+
metadata: {
|
|
177
|
+
'Execution time': formatDuration(executionTime),
|
|
178
|
+
'Token budget': TOKEN_BUDGETS.RESEARCH.toLocaleString(),
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
mcpLog('info', `Research completed: ${successful.length}/${questions.length} successful, ${totalTokens.toLocaleString()} tokens`, 'research');
|
|
161
182
|
return {
|
|
162
|
-
content:
|
|
183
|
+
content: formattedContent,
|
|
163
184
|
structuredContent: {
|
|
164
185
|
totalQuestions: questions.length,
|
|
165
186
|
successful: successful.length,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAyB,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/scrape.d.ts
CHANGED
|
@@ -3,17 +3,12 @@
|
|
|
3
3
|
* Implements robust error handling that NEVER crashes the MCP server
|
|
4
4
|
*/
|
|
5
5
|
import type { ScrapeLinksParams, ScrapeLinksOutput } from '../schemas/scrape-links.js';
|
|
6
|
-
interface ToolOptions {
|
|
7
|
-
sessionId?: string;
|
|
8
|
-
logger?: (level: 'info' | 'error' | 'debug', message: string, sessionId: string) => Promise<void>;
|
|
9
|
-
}
|
|
10
6
|
/**
|
|
11
7
|
* Handle scrape links request
|
|
12
8
|
* NEVER throws - always returns a valid response with content and metadata
|
|
13
9
|
*/
|
|
14
|
-
export declare function handleScrapeLinks(params: ScrapeLinksParams
|
|
10
|
+
export declare function handleScrapeLinks(params: ScrapeLinksParams): Promise<{
|
|
15
11
|
content: string;
|
|
16
12
|
structuredContent: ScrapeLinksOutput;
|
|
17
13
|
}>;
|
|
18
|
-
export {};
|
|
19
14
|
//# sourceMappingURL=scrape.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrape.d.ts","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"scrape.d.ts","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAgCvF;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAiMpE"}
|
package/dist/tools/scrape.js
CHANGED
|
@@ -9,6 +9,7 @@ import { removeMetaTags } from '../utils/markdown-formatter.js';
|
|
|
9
9
|
import { SCRAPER } from '../config/index.js';
|
|
10
10
|
import { getToolConfig } from '../config/loader.js';
|
|
11
11
|
import { classifyError } from '../utils/errors.js';
|
|
12
|
+
import { mcpLog, formatSuccess, formatError, formatBatchHeader, formatDuration, TOKEN_BUDGETS, calculateTokenAllocation, } from './utils.js';
|
|
12
13
|
// Module-level singleton - MarkdownCleaner is stateless
|
|
13
14
|
const markdownCleaner = new MarkdownCleaner();
|
|
14
15
|
// Get extraction suffix from YAML config (fallback to hardcoded if not found)
|
|
@@ -16,53 +17,39 @@ function getExtractionSuffix() {
|
|
|
16
17
|
const config = getToolConfig('scrape_links');
|
|
17
18
|
return config?.limits?.extraction_suffix || SCRAPER.EXTRACTION_SUFFIX;
|
|
18
19
|
}
|
|
19
|
-
function calculateTokenAllocation(urlCount) {
|
|
20
|
-
if (urlCount <= 0)
|
|
21
|
-
return SCRAPER.MAX_TOKENS_BUDGET;
|
|
22
|
-
return Math.floor(SCRAPER.MAX_TOKENS_BUDGET / urlCount);
|
|
23
|
-
}
|
|
24
20
|
function enhanceExtractionInstruction(instruction) {
|
|
25
21
|
const base = instruction || 'Extract the main content and key information from this page.';
|
|
26
22
|
return `${base}\n\n${getExtractionSuffix()}`;
|
|
27
23
|
}
|
|
28
|
-
/**
|
|
29
|
-
* Safe logger wrapper - NEVER throws
|
|
30
|
-
*/
|
|
31
|
-
async function safeLog(logger, sessionId, level, message) {
|
|
32
|
-
if (!logger || !sessionId)
|
|
33
|
-
return;
|
|
34
|
-
try {
|
|
35
|
-
await logger(level, message, sessionId);
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
// Silently ignore logger errors - they should never crash the tool
|
|
39
|
-
console.error(`[Scrape Tool] Logger failed: ${message}`);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
24
|
/**
|
|
43
25
|
* Handle scrape links request
|
|
44
26
|
* NEVER throws - always returns a valid response with content and metadata
|
|
45
27
|
*/
|
|
46
|
-
export async function handleScrapeLinks(params
|
|
47
|
-
const { sessionId, logger } = options;
|
|
28
|
+
export async function handleScrapeLinks(params) {
|
|
48
29
|
const startTime = Date.now();
|
|
49
30
|
// Helper to create error response
|
|
50
|
-
const createErrorResponse = (message,
|
|
51
|
-
content:
|
|
31
|
+
const createErrorResponse = (code, message, retryable = false) => ({
|
|
32
|
+
content: formatError({
|
|
33
|
+
code,
|
|
34
|
+
message,
|
|
35
|
+
retryable,
|
|
36
|
+
toolName: 'scrape_links',
|
|
37
|
+
howToFix: code === 'NO_URLS' ? ['Provide at least one valid URL'] : undefined,
|
|
38
|
+
}),
|
|
52
39
|
structuredContent: {
|
|
53
|
-
content:
|
|
40
|
+
content: message,
|
|
54
41
|
metadata: {
|
|
55
42
|
total_urls: params.urls?.length || 0,
|
|
56
43
|
successful: 0,
|
|
57
44
|
failed: params.urls?.length || 0,
|
|
58
45
|
total_credits: 0,
|
|
59
|
-
execution_time_ms:
|
|
46
|
+
execution_time_ms: Date.now() - startTime,
|
|
60
47
|
},
|
|
61
48
|
},
|
|
62
49
|
});
|
|
63
50
|
// Validate params
|
|
64
51
|
if (!params.urls || params.urls.length === 0) {
|
|
65
|
-
return createErrorResponse('No URLs provided'
|
|
52
|
+
return createErrorResponse('NO_URLS', 'No URLs provided');
|
|
66
53
|
}
|
|
67
54
|
// Filter out invalid URLs early
|
|
68
55
|
const validUrls = [];
|
|
@@ -77,11 +64,11 @@ export async function handleScrapeLinks(params, options = {}) {
|
|
|
77
64
|
}
|
|
78
65
|
}
|
|
79
66
|
if (validUrls.length === 0) {
|
|
80
|
-
return createErrorResponse(`All ${params.urls.length} URLs are invalid
|
|
67
|
+
return createErrorResponse('INVALID_URLS', `All ${params.urls.length} URLs are invalid`);
|
|
81
68
|
}
|
|
82
|
-
const tokensPerUrl = calculateTokenAllocation(validUrls.length);
|
|
69
|
+
const tokensPerUrl = calculateTokenAllocation(validUrls.length, TOKEN_BUDGETS.SCRAPER);
|
|
83
70
|
const totalBatches = Math.ceil(validUrls.length / SCRAPER.BATCH_SIZE);
|
|
84
|
-
|
|
71
|
+
mcpLog('info', `Starting scrape: ${validUrls.length} URL(s), ${tokensPerUrl} tokens/URL, ${totalBatches} batch(es)`, 'scrape');
|
|
85
72
|
// Initialize clients safely
|
|
86
73
|
let client;
|
|
87
74
|
try {
|
|
@@ -89,7 +76,7 @@ export async function handleScrapeLinks(params, options = {}) {
|
|
|
89
76
|
}
|
|
90
77
|
catch (error) {
|
|
91
78
|
const err = classifyError(error);
|
|
92
|
-
return createErrorResponse(`Failed to initialize scraper: ${err.message}
|
|
79
|
+
return createErrorResponse('CLIENT_INIT_FAILED', `Failed to initialize scraper: ${err.message}`);
|
|
93
80
|
}
|
|
94
81
|
const llmProcessor = createLLMProcessor(); // Returns null if not configured
|
|
95
82
|
const enhancedInstruction = params.use_llm
|
|
@@ -97,7 +84,7 @@ export async function handleScrapeLinks(params, options = {}) {
|
|
|
97
84
|
: undefined;
|
|
98
85
|
// Scrape URLs - scrapeMultiple NEVER throws
|
|
99
86
|
const results = await client.scrapeMultiple(validUrls, { timeout: params.timeout });
|
|
100
|
-
|
|
87
|
+
mcpLog('info', `Scraping complete. Processing ${results.length} results...`, 'scrape');
|
|
101
88
|
let successful = 0;
|
|
102
89
|
let failed = 0;
|
|
103
90
|
let totalCredits = 0;
|
|
@@ -116,13 +103,13 @@ export async function handleScrapeLinks(params, options = {}) {
|
|
|
116
103
|
contents.push(`## Unknown URL\n\n❌ No result returned`);
|
|
117
104
|
continue;
|
|
118
105
|
}
|
|
119
|
-
|
|
106
|
+
mcpLog('debug', `[${i + 1}/${results.length}] Processing ${result.url}`, 'scrape');
|
|
120
107
|
// Check for errors in result
|
|
121
108
|
if (result.error || result.statusCode < 200 || result.statusCode >= 300) {
|
|
122
109
|
failed++;
|
|
123
110
|
const errorMsg = result.error?.message || result.content || `HTTP ${result.statusCode}`;
|
|
124
111
|
contents.push(`## ${result.url}\n\n❌ Failed to scrape: ${errorMsg}`);
|
|
125
|
-
|
|
112
|
+
mcpLog('warning', `[${i + 1}/${results.length}] Failed: ${errorMsg}`, 'scrape');
|
|
126
113
|
continue;
|
|
127
114
|
}
|
|
128
115
|
// Success case
|
|
@@ -139,15 +126,15 @@ export async function handleScrapeLinks(params, options = {}) {
|
|
|
139
126
|
}
|
|
140
127
|
// Apply LLM extraction if enabled - processContentWithLLM NEVER throws
|
|
141
128
|
if (params.use_llm && llmProcessor) {
|
|
142
|
-
|
|
129
|
+
mcpLog('debug', `[${i + 1}/${results.length}] Applying LLM extraction (${tokensPerUrl} tokens)...`, 'scrape');
|
|
143
130
|
const llmResult = await processContentWithLLM(content, { use_llm: params.use_llm, what_to_extract: enhancedInstruction, max_tokens: tokensPerUrl }, llmProcessor);
|
|
144
131
|
if (llmResult.processed) {
|
|
145
132
|
content = llmResult.content;
|
|
146
|
-
|
|
133
|
+
mcpLog('debug', `[${i + 1}/${results.length}] LLM extraction complete`, 'scrape');
|
|
147
134
|
}
|
|
148
135
|
else {
|
|
149
136
|
llmErrors++;
|
|
150
|
-
|
|
137
|
+
mcpLog('warning', `[${i + 1}/${results.length}] LLM extraction skipped: ${llmResult.error || 'unknown reason'}`, 'scrape');
|
|
151
138
|
// Continue with original content - graceful degradation
|
|
152
139
|
}
|
|
153
140
|
}
|
|
@@ -161,11 +148,35 @@ export async function handleScrapeLinks(params, options = {}) {
|
|
|
161
148
|
contents.push(`## ${result.url}\n\n${content}`);
|
|
162
149
|
}
|
|
163
150
|
const executionTime = Date.now() - startTime;
|
|
164
|
-
|
|
165
|
-
// Build response
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
151
|
+
mcpLog('info', `Completed: ${successful} successful, ${failed} failed, ${totalCredits} credits used`, 'scrape');
|
|
152
|
+
// Build 70/20/10 response
|
|
153
|
+
const batchHeader = formatBatchHeader({
|
|
154
|
+
title: `Scraped Content (${params.urls.length} URLs)`,
|
|
155
|
+
totalItems: params.urls.length,
|
|
156
|
+
successful,
|
|
157
|
+
failed,
|
|
158
|
+
tokensPerItem: tokensPerUrl,
|
|
159
|
+
batches: totalBatches,
|
|
160
|
+
extras: {
|
|
161
|
+
'Credits used': totalCredits,
|
|
162
|
+
...(llmErrors > 0 ? { 'LLM extraction failures': llmErrors } : {}),
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
const nextSteps = [
|
|
166
|
+
successful > 0 ? `Extract specific data: scrape_links(urls=[...], use_llm=true, what_to_extract="Extract pricing | features | testimonials")` : null,
|
|
167
|
+
failed > 0 ? `Retry failed URLs with longer timeout: scrape_links(urls=[...], timeout=60)` : null,
|
|
168
|
+
'Research further: deep_research(questions=[{question: "Based on scraped content..."}])',
|
|
169
|
+
].filter(Boolean);
|
|
170
|
+
const formattedContent = formatSuccess({
|
|
171
|
+
title: 'Scraping Complete',
|
|
172
|
+
summary: batchHeader,
|
|
173
|
+
data: contents.join('\n\n---\n\n'),
|
|
174
|
+
nextSteps,
|
|
175
|
+
metadata: {
|
|
176
|
+
'Execution time': formatDuration(executionTime),
|
|
177
|
+
'Token budget': TOKEN_BUDGETS.SCRAPER.toLocaleString(),
|
|
178
|
+
},
|
|
179
|
+
});
|
|
169
180
|
const metadata = {
|
|
170
181
|
total_urls: params.urls.length,
|
|
171
182
|
successful,
|
|
@@ -173,7 +184,7 @@ export async function handleScrapeLinks(params, options = {}) {
|
|
|
173
184
|
total_credits: totalCredits,
|
|
174
185
|
execution_time_ms: executionTime,
|
|
175
186
|
tokens_per_url: tokensPerUrl,
|
|
176
|
-
total_token_budget: SCRAPER
|
|
187
|
+
total_token_budget: TOKEN_BUDGETS.SCRAPER,
|
|
177
188
|
batches_processed: totalBatches,
|
|
178
189
|
};
|
|
179
190
|
return { content: formattedContent, structuredContent: { content: formattedContent, metadata } };
|
package/dist/tools/scrape.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/search.d.ts
CHANGED
|
@@ -3,13 +3,8 @@
|
|
|
3
3
|
* NEVER throws - always returns structured response for graceful degradation
|
|
4
4
|
*/
|
|
5
5
|
import type { WebSearchParams, WebSearchOutput } from '../schemas/web-search.js';
|
|
6
|
-
|
|
7
|
-
sessionId?: string;
|
|
8
|
-
logger?: (level: 'info' | 'error' | 'debug', message: string, sessionId: string) => Promise<void>;
|
|
9
|
-
}
|
|
10
|
-
export declare function handleWebSearch(params: WebSearchParams, options?: ToolOptions): Promise<{
|
|
6
|
+
export declare function handleWebSearch(params: WebSearchParams): Promise<{
|
|
11
7
|
content: string;
|
|
12
8
|
structuredContent: WebSearchOutput;
|
|
13
9
|
}>;
|
|
14
|
-
export {};
|
|
15
10
|
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAyBjF,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,eAAe,CAAA;CAAE,CAAC,CA2JlE"}
|
package/dist/tools/search.js
CHANGED
|
@@ -6,19 +6,17 @@ import { SearchClient } from '../clients/search.js';
|
|
|
6
6
|
import { aggregateAndRank, buildUrlLookup, lookupUrl, generateEnhancedOutput, markConsensus, } from '../utils/url-aggregator.js';
|
|
7
7
|
import { CTR_WEIGHTS } from '../config/index.js';
|
|
8
8
|
import { classifyError } from '../utils/errors.js';
|
|
9
|
+
import { mcpLog, formatError, formatDuration, } from './utils.js';
|
|
9
10
|
function getPositionScore(position) {
|
|
10
11
|
if (position >= 1 && position <= 10) {
|
|
11
12
|
return CTR_WEIGHTS[position] ?? 0;
|
|
12
13
|
}
|
|
13
14
|
return Math.max(0, 10 - (position - 10) * 0.5);
|
|
14
15
|
}
|
|
15
|
-
export async function handleWebSearch(params
|
|
16
|
-
const { sessionId, logger } = options;
|
|
16
|
+
export async function handleWebSearch(params) {
|
|
17
17
|
const startTime = Date.now();
|
|
18
18
|
try {
|
|
19
|
-
|
|
20
|
-
await logger('info', `Searching for ${params.keywords.length} keyword(s)`, sessionId);
|
|
21
|
-
}
|
|
19
|
+
mcpLog('info', `Searching for ${params.keywords.length} keyword(s)`, 'search');
|
|
22
20
|
const client = new SearchClient();
|
|
23
21
|
const response = await client.searchMultiple(params.keywords);
|
|
24
22
|
const aggregation = aggregateAndRank(response.searches, 5);
|
|
@@ -87,9 +85,16 @@ export async function handleWebSearch(params, options = {}) {
|
|
|
87
85
|
markdown += `\n---\n\n> *${queriesOmitted} additional queries not shown. Consensus URLs above include all ${response.searches.length} queries.*\n`;
|
|
88
86
|
}
|
|
89
87
|
const executionTime = Date.now() - startTime;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
88
|
+
mcpLog('info', `Search completed: ${totalResults} results, ${aggregation.totalUniqueUrls} unique URLs, ${consensusUrls.length} consensus`, 'search');
|
|
89
|
+
// Add Next Steps section
|
|
90
|
+
const nextSteps = [
|
|
91
|
+
consensusUrls.length > 0 ? `Scrape top consensus URLs: scrape_links(urls=[${consensusUrls.slice(0, 3).map(u => `"${u.url}"`).join(', ')}], use_llm=true)` : null,
|
|
92
|
+
'Get Reddit perspective: search_reddit(queries=[...related terms...])',
|
|
93
|
+
'Deep research: deep_research(questions=[{question: "Based on search results..."}])',
|
|
94
|
+
].filter(Boolean);
|
|
95
|
+
markdown += '\n\n---\n\n**Next Steps:**\n';
|
|
96
|
+
nextSteps.forEach(step => { markdown += `→ ${step}\n`; });
|
|
97
|
+
markdown += `\n---\n*${formatDuration(executionTime)} | ${aggregation.totalUniqueUrls} unique URLs | ${consensusUrls.length} consensus*`;
|
|
93
98
|
const metadata = {
|
|
94
99
|
total_keywords: response.totalKeywords,
|
|
95
100
|
total_results: totalResults,
|
|
@@ -101,17 +106,20 @@ export async function handleWebSearch(params, options = {}) {
|
|
|
101
106
|
return { content: markdown, structuredContent: { content: markdown, metadata } };
|
|
102
107
|
}
|
|
103
108
|
catch (error) {
|
|
104
|
-
// Classify error for better reporting
|
|
105
109
|
const structuredError = classifyError(error);
|
|
106
|
-
const errorCode = structuredError.code;
|
|
107
|
-
if (sessionId && logger) {
|
|
108
|
-
await logger('error', `web_search: ${structuredError.message}`, sessionId);
|
|
109
|
-
}
|
|
110
110
|
const executionTime = Date.now() - startTime;
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
:
|
|
114
|
-
|
|
111
|
+
mcpLog('error', `web_search: ${structuredError.message}`, 'search');
|
|
112
|
+
const errorContent = formatError({
|
|
113
|
+
code: structuredError.code,
|
|
114
|
+
message: structuredError.message,
|
|
115
|
+
retryable: structuredError.retryable,
|
|
116
|
+
toolName: 'web_search',
|
|
117
|
+
howToFix: ['Verify SERPER_API_KEY is set correctly'],
|
|
118
|
+
alternatives: [
|
|
119
|
+
'search_reddit(queries=[...]) for Reddit-specific results',
|
|
120
|
+
'deep_research(questions=[...]) for AI-synthesized research',
|
|
121
|
+
],
|
|
122
|
+
});
|
|
115
123
|
return {
|
|
116
124
|
content: errorContent,
|
|
117
125
|
structuredContent: {
|
|
@@ -120,7 +128,7 @@ export async function handleWebSearch(params, options = {}) {
|
|
|
120
128
|
total_keywords: params.keywords.length,
|
|
121
129
|
total_results: 0,
|
|
122
130
|
execution_time_ms: executionTime,
|
|
123
|
-
errorCode
|
|
131
|
+
errorCode: structuredError.code,
|
|
124
132
|
},
|
|
125
133
|
},
|
|
126
134
|
};
|
package/dist/tools/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,sBAAsB,EACtB,aAAa,GACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAA0C,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/utils.d.ts
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
* Shared Tool Utilities
|
|
3
3
|
* Extracted from individual handlers to eliminate duplication
|
|
4
4
|
*/
|
|
5
|
+
export { mcpLog, safeLog as safeLogSimple, createToolLogger, type LogLevel, type ToolLogger as SimpleToolLogger, } from '../utils/logger.js';
|
|
6
|
+
export { formatSuccess, formatError, formatBatchHeader, formatList, formatDuration, truncateText, type SuccessOptions, type ErrorOptions, type BatchHeaderOptions, type ListItem, } from '../utils/response.js';
|
|
7
|
+
/**
|
|
8
|
+
* Centralized token budgets for all tools
|
|
9
|
+
*/
|
|
10
|
+
export declare const TOKEN_BUDGETS: {
|
|
11
|
+
/** Deep research total budget */
|
|
12
|
+
readonly RESEARCH: 32000;
|
|
13
|
+
/** Web scraper total budget */
|
|
14
|
+
readonly SCRAPER: 32000;
|
|
15
|
+
/** Reddit comment budget per batch */
|
|
16
|
+
readonly REDDIT_COMMENTS: 1000;
|
|
17
|
+
};
|
|
5
18
|
/**
|
|
6
19
|
* Logger function type used by tools
|
|
7
20
|
*/
|