mcp-researchpowerpack 3.9.4 → 4.3.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 +116 -208
- package/dist/index.js +280 -337
- package/dist/index.js.map +7 -1
- package/dist/mcp-use.json +7 -0
- package/dist/src/clients/reddit.js +278 -0
- package/dist/src/clients/reddit.js.map +7 -0
- package/dist/src/clients/scraper.js +326 -0
- package/dist/src/clients/scraper.js.map +7 -0
- package/dist/src/clients/search.js +217 -0
- package/dist/src/clients/search.js.map +7 -0
- package/dist/src/config/index.js +138 -0
- package/dist/src/config/index.js.map +7 -0
- package/dist/src/prompts/deep-research.js +41 -0
- package/dist/src/prompts/deep-research.js.map +7 -0
- package/dist/src/prompts/reddit-sentiment.js +47 -0
- package/dist/src/prompts/reddit-sentiment.js.map +7 -0
- package/dist/src/schemas/reddit.js +21 -0
- package/dist/src/schemas/reddit.js.map +7 -0
- package/dist/src/schemas/scrape-links.js +26 -0
- package/dist/src/schemas/scrape-links.js.map +7 -0
- package/dist/src/schemas/start-research.js +17 -0
- package/dist/src/schemas/start-research.js.map +7 -0
- package/dist/src/schemas/web-search.js +53 -0
- package/dist/src/schemas/web-search.js.map +7 -0
- package/dist/src/services/llm-processor.js +675 -0
- package/dist/src/services/llm-processor.js.map +7 -0
- package/dist/src/services/markdown-cleaner.js +62 -0
- package/dist/src/services/markdown-cleaner.js.map +7 -0
- package/dist/src/services/workflow-state.js +116 -0
- package/dist/src/services/workflow-state.js.map +7 -0
- package/dist/src/tools/mcp-helpers.js +50 -0
- package/dist/src/tools/mcp-helpers.js.map +7 -0
- package/dist/src/tools/reddit.js +277 -0
- package/dist/src/tools/reddit.js.map +7 -0
- package/dist/src/tools/registry.js +18 -0
- package/dist/src/tools/registry.js.map +7 -0
- package/dist/src/tools/scrape.js +334 -0
- package/dist/src/tools/scrape.js.map +7 -0
- package/dist/src/tools/search.js +423 -0
- package/dist/src/tools/search.js.map +7 -0
- package/dist/src/tools/start-research.js +199 -0
- package/dist/src/tools/start-research.js.map +7 -0
- package/dist/src/tools/utils.js +29 -0
- package/dist/src/tools/utils.js.map +7 -0
- package/dist/src/utils/bootstrap-guard.js +27 -0
- package/dist/src/utils/bootstrap-guard.js.map +7 -0
- package/dist/src/utils/concurrency.js +62 -0
- package/dist/src/utils/concurrency.js.map +7 -0
- package/dist/src/utils/content-extractor.js +61 -0
- package/dist/src/utils/content-extractor.js.map +7 -0
- package/dist/src/utils/errors.js +211 -0
- package/dist/src/utils/errors.js.map +7 -0
- package/dist/src/utils/logger.js +25 -0
- package/dist/src/utils/logger.js.map +7 -0
- package/dist/src/utils/markdown-formatter.js +15 -0
- package/dist/src/utils/markdown-formatter.js.map +7 -0
- package/dist/src/utils/reddit-keyword-guard.js +29 -0
- package/dist/src/utils/reddit-keyword-guard.js.map +7 -0
- package/dist/src/utils/response.js +81 -0
- package/dist/src/utils/response.js.map +7 -0
- package/dist/src/utils/retry.js +13 -0
- package/dist/src/utils/retry.js.map +7 -0
- package/dist/src/utils/sanitize.js +10 -0
- package/dist/src/utils/sanitize.js.map +7 -0
- package/dist/src/utils/source-type.js +41 -0
- package/dist/src/utils/source-type.js.map +7 -0
- package/dist/src/utils/url-aggregator.js +227 -0
- package/dist/src/utils/url-aggregator.js.map +7 -0
- package/dist/src/utils/workflow-key.js +14 -0
- package/dist/src/utils/workflow-key.js.map +7 -0
- package/dist/src/version.js +32 -0
- package/dist/src/version.js.map +7 -0
- package/package.json +33 -28
- package/dist/clients/reddit.d.ts +0 -69
- package/dist/clients/reddit.d.ts.map +0 -1
- package/dist/clients/reddit.js +0 -369
- package/dist/clients/reddit.js.map +0 -1
- package/dist/clients/research.d.ts +0 -67
- package/dist/clients/research.d.ts.map +0 -1
- package/dist/clients/research.js +0 -290
- package/dist/clients/research.js.map +0 -1
- package/dist/clients/scraper.d.ts +0 -72
- package/dist/clients/scraper.d.ts.map +0 -1
- package/dist/clients/scraper.js +0 -338
- package/dist/clients/scraper.js.map +0 -1
- package/dist/clients/search.d.ts +0 -57
- package/dist/clients/search.d.ts.map +0 -1
- package/dist/clients/search.js +0 -223
- package/dist/clients/search.js.map +0 -1
- package/dist/config/index.d.ts +0 -78
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -201
- package/dist/config/index.js.map +0 -1
- package/dist/config/loader.d.ts +0 -40
- package/dist/config/loader.d.ts.map +0 -1
- package/dist/config/loader.js +0 -322
- package/dist/config/loader.js.map +0 -1
- package/dist/config/types.d.ts +0 -81
- package/dist/config/types.d.ts.map +0 -1
- package/dist/config/types.js +0 -6
- package/dist/config/types.js.map +0 -1
- package/dist/config/yaml/tools.yaml +0 -146
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +0 -1
- package/dist/schemas/deep-research.d.ts +0 -64
- package/dist/schemas/deep-research.d.ts.map +0 -1
- package/dist/schemas/deep-research.js +0 -224
- package/dist/schemas/deep-research.js.map +0 -1
- package/dist/schemas/scrape-links.d.ts +0 -32
- package/dist/schemas/scrape-links.d.ts.map +0 -1
- package/dist/schemas/scrape-links.js +0 -34
- package/dist/schemas/scrape-links.js.map +0 -1
- package/dist/schemas/web-search.d.ts +0 -22
- package/dist/schemas/web-search.d.ts.map +0 -1
- package/dist/schemas/web-search.js +0 -21
- package/dist/schemas/web-search.js.map +0 -1
- package/dist/services/file-attachment.d.ts +0 -30
- package/dist/services/file-attachment.d.ts.map +0 -1
- package/dist/services/file-attachment.js +0 -207
- package/dist/services/file-attachment.js.map +0 -1
- package/dist/services/llm-processor.d.ts +0 -29
- package/dist/services/llm-processor.d.ts.map +0 -1
- package/dist/services/llm-processor.js +0 -244
- package/dist/services/llm-processor.js.map +0 -1
- package/dist/services/markdown-cleaner.d.ts +0 -8
- package/dist/services/markdown-cleaner.d.ts.map +0 -1
- package/dist/services/markdown-cleaner.js +0 -74
- package/dist/services/markdown-cleaner.js.map +0 -1
- package/dist/tools/definitions.d.ts +0 -16
- package/dist/tools/definitions.d.ts.map +0 -1
- package/dist/tools/definitions.js +0 -17
- package/dist/tools/definitions.js.map +0 -1
- package/dist/tools/reddit.d.ts +0 -14
- package/dist/tools/reddit.d.ts.map +0 -1
- package/dist/tools/reddit.js +0 -265
- package/dist/tools/reddit.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -71
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -252
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/research.d.ts +0 -14
- package/dist/tools/research.d.ts.map +0 -1
- package/dist/tools/research.js +0 -196
- package/dist/tools/research.js.map +0 -1
- package/dist/tools/scrape.d.ts +0 -14
- package/dist/tools/scrape.d.ts.map +0 -1
- package/dist/tools/scrape.js +0 -234
- package/dist/tools/scrape.js.map +0 -1
- package/dist/tools/search.d.ts +0 -10
- package/dist/tools/search.d.ts.map +0 -1
- package/dist/tools/search.js +0 -158
- package/dist/tools/search.js.map +0 -1
- package/dist/tools/utils.d.ts +0 -105
- package/dist/tools/utils.d.ts.map +0 -1
- package/dist/tools/utils.js +0 -159
- package/dist/tools/utils.js.map +0 -1
- package/dist/utils/concurrency.d.ts +0 -28
- package/dist/utils/concurrency.d.ts.map +0 -1
- package/dist/utils/concurrency.js +0 -92
- package/dist/utils/concurrency.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -95
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -390
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -39
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -57
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/markdown-formatter.d.ts +0 -5
- package/dist/utils/markdown-formatter.d.ts.map +0 -1
- package/dist/utils/markdown-formatter.js +0 -15
- package/dist/utils/markdown-formatter.js.map +0 -1
- package/dist/utils/response.d.ts +0 -93
- package/dist/utils/response.d.ts.map +0 -1
- package/dist/utils/response.js +0 -170
- package/dist/utils/response.js.map +0 -1
- package/dist/utils/retry.d.ts +0 -43
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js +0 -57
- package/dist/utils/retry.js.map +0 -1
- package/dist/utils/url-aggregator.d.ts +0 -90
- package/dist/utils/url-aggregator.d.ts.map +0 -1
- package/dist/utils/url-aggregator.js +0 -538
- package/dist/utils/url-aggregator.js.map +0 -1
- package/dist/version.d.ts +0 -29
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -55
- package/dist/version.js.map +0 -1
package/dist/tools/registry.js
DELETED
|
@@ -1,252 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Handler Registry - Central tool registration and execution
|
|
3
|
-
* Eliminates repetitive if/else routing with declarative registration
|
|
4
|
-
*/
|
|
5
|
-
import { z, ZodError } from 'zod';
|
|
6
|
-
import { McpError, ErrorCode as McpErrorCode } from '@modelcontextprotocol/sdk/types.js';
|
|
7
|
-
import { parseEnv, getCapabilities, getMissingEnvMessage } from '../config/index.js';
|
|
8
|
-
import { classifyError, createToolErrorFromStructured } from '../utils/errors.js';
|
|
9
|
-
// Import schemas
|
|
10
|
-
import { deepResearchParamsSchema } from '../schemas/deep-research.js';
|
|
11
|
-
import { scrapeLinksParamsSchema } from '../schemas/scrape-links.js';
|
|
12
|
-
import { webSearchParamsSchema } from '../schemas/web-search.js';
|
|
13
|
-
// Import handlers
|
|
14
|
-
import { handleSearchReddit, handleGetRedditPosts } from './reddit.js';
|
|
15
|
-
import { handleDeepResearch } from './research.js';
|
|
16
|
-
import { handleScrapeLinks } from './scrape.js';
|
|
17
|
-
import { handleWebSearch } from './search.js';
|
|
18
|
-
// ============================================================================
|
|
19
|
-
// Schemas for Simple Tools (inline definitions)
|
|
20
|
-
// ============================================================================
|
|
21
|
-
const searchRedditParamsSchema = z.object({
|
|
22
|
-
queries: z.array(z.string()).min(3, 'search_reddit: MINIMUM 3 queries required. Add more diverse queries covering different perspectives.').max(50),
|
|
23
|
-
date_after: z.string().optional(),
|
|
24
|
-
});
|
|
25
|
-
const getRedditPostParamsSchema = z.object({
|
|
26
|
-
urls: z.array(z.string()).min(2).max(50)
|
|
27
|
-
.describe('2-50 Reddit URLs. More = broader consensus. Get from search_reddit.'),
|
|
28
|
-
fetch_comments: z.boolean().default(true)
|
|
29
|
-
.describe('Fetch comments (true recommended - best insights in comments)'),
|
|
30
|
-
max_comments: z.number().default(100)
|
|
31
|
-
.describe('Override auto allocation. Leave empty for smart allocation.'),
|
|
32
|
-
use_llm: z.boolean().default(false)
|
|
33
|
-
.describe('Default false — DO NOT enable unless user explicitly requests synthesis. Raw comments preserve exact quotes, code snippets, and nuanced opinions that LLM summarization loses.'),
|
|
34
|
-
what_to_extract: z.string().optional()
|
|
35
|
-
.describe('Only used when use_llm=true. Extraction instructions for AI synthesis.'),
|
|
36
|
-
});
|
|
37
|
-
// ============================================================================
|
|
38
|
-
// Handler Wrappers
|
|
39
|
-
// ============================================================================
|
|
40
|
-
const env = parseEnv();
|
|
41
|
-
/**
|
|
42
|
-
* Wrapper for search_reddit handler
|
|
43
|
-
*/
|
|
44
|
-
async function searchRedditHandler(params) {
|
|
45
|
-
const p = params;
|
|
46
|
-
return handleSearchReddit(p.queries, env.SEARCH_API_KEY || '', p.date_after);
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Wrapper for get_reddit_post handler
|
|
50
|
-
*/
|
|
51
|
-
async function getRedditPostHandler(params) {
|
|
52
|
-
const p = params;
|
|
53
|
-
return handleGetRedditPosts(p.urls, env.REDDIT_CLIENT_ID || '', env.REDDIT_CLIENT_SECRET || '', p.max_comments, {
|
|
54
|
-
fetchComments: p.fetch_comments,
|
|
55
|
-
maxCommentsOverride: p.max_comments !== 100 ? p.max_comments : undefined,
|
|
56
|
-
use_llm: p.use_llm,
|
|
57
|
-
what_to_extract: p.what_to_extract,
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Wrapper for deep_research handler
|
|
62
|
-
*/
|
|
63
|
-
async function deepResearchHandler(params) {
|
|
64
|
-
const { content } = await handleDeepResearch(params);
|
|
65
|
-
return content;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Wrapper for scrape_links handler
|
|
69
|
-
*/
|
|
70
|
-
async function scrapeLinksHandler(params) {
|
|
71
|
-
const { content } = await handleScrapeLinks(params);
|
|
72
|
-
return content;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Wrapper for web_search handler
|
|
76
|
-
*/
|
|
77
|
-
async function webSearchHandler(params) {
|
|
78
|
-
const { content } = await handleWebSearch(params);
|
|
79
|
-
return content;
|
|
80
|
-
}
|
|
81
|
-
// ============================================================================
|
|
82
|
-
// Tool Registry
|
|
83
|
-
// ============================================================================
|
|
84
|
-
/**
|
|
85
|
-
* Central registry of all MCP tools
|
|
86
|
-
*/
|
|
87
|
-
export const toolRegistry = {
|
|
88
|
-
search_reddit: {
|
|
89
|
-
name: 'search_reddit',
|
|
90
|
-
capability: 'search',
|
|
91
|
-
schema: searchRedditParamsSchema,
|
|
92
|
-
handler: searchRedditHandler,
|
|
93
|
-
},
|
|
94
|
-
get_reddit_post: {
|
|
95
|
-
name: 'get_reddit_post',
|
|
96
|
-
capability: 'reddit',
|
|
97
|
-
schema: getRedditPostParamsSchema,
|
|
98
|
-
handler: getRedditPostHandler,
|
|
99
|
-
},
|
|
100
|
-
deep_research: {
|
|
101
|
-
name: 'deep_research',
|
|
102
|
-
capability: 'deepResearch',
|
|
103
|
-
schema: deepResearchParamsSchema,
|
|
104
|
-
handler: deepResearchHandler,
|
|
105
|
-
transformResponse: (result) => ({
|
|
106
|
-
content: result,
|
|
107
|
-
isError: result.includes('# ❌ Error'),
|
|
108
|
-
}),
|
|
109
|
-
},
|
|
110
|
-
scrape_links: {
|
|
111
|
-
name: 'scrape_links',
|
|
112
|
-
capability: 'scraping',
|
|
113
|
-
schema: scrapeLinksParamsSchema,
|
|
114
|
-
handler: scrapeLinksHandler,
|
|
115
|
-
transformResponse: (result) => ({
|
|
116
|
-
content: result,
|
|
117
|
-
isError: result.includes('# ❌ Scraping Failed'),
|
|
118
|
-
}),
|
|
119
|
-
},
|
|
120
|
-
web_search: {
|
|
121
|
-
name: 'web_search',
|
|
122
|
-
capability: 'search',
|
|
123
|
-
schema: webSearchParamsSchema,
|
|
124
|
-
handler: webSearchHandler,
|
|
125
|
-
transformResponse: (result) => ({
|
|
126
|
-
content: result,
|
|
127
|
-
isError: result.includes('# ❌ web_search'),
|
|
128
|
-
}),
|
|
129
|
-
},
|
|
130
|
-
};
|
|
131
|
-
// ============================================================================
|
|
132
|
-
// Execute Tool Helpers
|
|
133
|
-
// ============================================================================
|
|
134
|
-
/**
|
|
135
|
-
* Validate params with Zod schema and optional post-validation.
|
|
136
|
-
* Returns validated params or a CallToolResult error.
|
|
137
|
-
*/
|
|
138
|
-
function validateToolParams(tool, args) {
|
|
139
|
-
let validatedParams;
|
|
140
|
-
try {
|
|
141
|
-
validatedParams = tool.schema.parse(args);
|
|
142
|
-
}
|
|
143
|
-
catch (error) {
|
|
144
|
-
if (error instanceof ZodError) {
|
|
145
|
-
const issues = error.issues
|
|
146
|
-
.map((i) => `- **${i.path.join('.') || 'root'}**: ${i.message}`)
|
|
147
|
-
.join('\n');
|
|
148
|
-
throw new McpError(McpErrorCode.InvalidParams, `Validation Error:\n${issues}`);
|
|
149
|
-
}
|
|
150
|
-
const structured = classifyError(error);
|
|
151
|
-
return createToolErrorFromStructured(structured);
|
|
152
|
-
}
|
|
153
|
-
if (tool.postValidate) {
|
|
154
|
-
const postError = tool.postValidate(validatedParams);
|
|
155
|
-
if (postError) {
|
|
156
|
-
return {
|
|
157
|
-
content: [{ type: 'text', text: `# ❌ Validation Error\n\n${postError}` }],
|
|
158
|
-
isError: true,
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return { params: validatedParams };
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Build the final CallToolResult from a handler result string,
|
|
166
|
-
* applying the tool's transformResponse if present.
|
|
167
|
-
*/
|
|
168
|
-
function buildToolResult(result, tool) {
|
|
169
|
-
if (tool.transformResponse) {
|
|
170
|
-
const transformed = tool.transformResponse(result);
|
|
171
|
-
return {
|
|
172
|
-
content: [{ type: 'text', text: transformed.content }],
|
|
173
|
-
isError: transformed.isError,
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
return {
|
|
177
|
-
content: [{ type: 'text', text: result }],
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
// ============================================================================
|
|
181
|
-
// Execute Tool (Main Entry Point)
|
|
182
|
-
// ============================================================================
|
|
183
|
-
/**
|
|
184
|
-
* Execute a tool by name with full middleware chain
|
|
185
|
-
*
|
|
186
|
-
* Middleware steps:
|
|
187
|
-
* 1. Lookup tool in registry (throw McpError if not found)
|
|
188
|
-
* 2. Check capability (return error response if missing)
|
|
189
|
-
* 3. Validate params with Zod (return error response if invalid)
|
|
190
|
-
* 4. Execute handler (catch and format any errors)
|
|
191
|
-
* 5. Transform response if needed
|
|
192
|
-
*
|
|
193
|
-
* @param name - Tool name from request
|
|
194
|
-
* @param args - Raw arguments from request
|
|
195
|
-
* @param capabilities - Current capabilities from getCapabilities()
|
|
196
|
-
* @returns MCP-compliant tool result
|
|
197
|
-
*/
|
|
198
|
-
export async function executeTool(name, args, capabilities) {
|
|
199
|
-
const tool = toolRegistry[name];
|
|
200
|
-
if (!tool) {
|
|
201
|
-
throw new McpError(McpErrorCode.MethodNotFound, `Method not found: ${name}. Available tools: ${Object.keys(toolRegistry).join(', ')}`);
|
|
202
|
-
}
|
|
203
|
-
if (tool.capability && !capabilities[tool.capability]) {
|
|
204
|
-
throw new McpError(McpErrorCode.InvalidRequest, getMissingEnvMessage(tool.capability));
|
|
205
|
-
}
|
|
206
|
-
const validation = validateToolParams(tool, args);
|
|
207
|
-
if ('content' in validation)
|
|
208
|
-
return validation;
|
|
209
|
-
let result;
|
|
210
|
-
try {
|
|
211
|
-
result = await tool.handler(validation.params);
|
|
212
|
-
}
|
|
213
|
-
catch (error) {
|
|
214
|
-
const structured = classifyError(error);
|
|
215
|
-
return createToolErrorFromStructured(structured);
|
|
216
|
-
}
|
|
217
|
-
return buildToolResult(result, tool);
|
|
218
|
-
}
|
|
219
|
-
// ============================================================================
|
|
220
|
-
// Utility Functions
|
|
221
|
-
// ============================================================================
|
|
222
|
-
/**
|
|
223
|
-
* Get list of all registered tool names
|
|
224
|
-
*/
|
|
225
|
-
export function getRegisteredToolNames() {
|
|
226
|
-
return Object.keys(toolRegistry);
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Check if a tool is registered
|
|
230
|
-
*/
|
|
231
|
-
export function isToolRegistered(name) {
|
|
232
|
-
return name in toolRegistry;
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* Get tool capabilities for logging
|
|
236
|
-
*/
|
|
237
|
-
export function getToolCapabilities() {
|
|
238
|
-
const caps = getCapabilities();
|
|
239
|
-
const enabled = [];
|
|
240
|
-
const disabled = [];
|
|
241
|
-
for (const [name, tool] of Object.entries(toolRegistry)) {
|
|
242
|
-
const capKey = tool.capability;
|
|
243
|
-
if (!capKey || caps[capKey]) {
|
|
244
|
-
enabled.push(name);
|
|
245
|
-
}
|
|
246
|
-
else {
|
|
247
|
-
disabled.push(name);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
return { enabled, disabled };
|
|
251
|
-
}
|
|
252
|
-
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/research.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Deep Research Tool Handler - Batch processing with dynamic token allocation
|
|
3
|
-
* Implements robust error handling that NEVER crashes
|
|
4
|
-
*/
|
|
5
|
-
import type { DeepResearchParams } from '../schemas/deep-research.js';
|
|
6
|
-
/**
|
|
7
|
-
* Handle deep research request
|
|
8
|
-
* NEVER throws - always returns a valid response
|
|
9
|
-
*/
|
|
10
|
-
export declare function handleDeepResearch(params: DeepResearchParams): Promise<{
|
|
11
|
-
content: string;
|
|
12
|
-
structuredContent: object;
|
|
13
|
-
}>;
|
|
14
|
-
//# sourceMappingURL=research.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAsMtE;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAC,CA2CzD"}
|
package/dist/tools/research.js
DELETED
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Deep Research Tool Handler - Batch processing with dynamic token allocation
|
|
3
|
-
* Implements robust error handling that NEVER crashes
|
|
4
|
-
*/
|
|
5
|
-
import { ResearchClient } from '../clients/research.js';
|
|
6
|
-
import { FileAttachmentService } from '../services/file-attachment.js';
|
|
7
|
-
import { RESEARCH, RESEARCH_PROMPTS } from '../config/index.js';
|
|
8
|
-
import { getToolConfig } from '../config/loader.js';
|
|
9
|
-
import { classifyError } from '../utils/errors.js';
|
|
10
|
-
import { pMap } from '../utils/concurrency.js';
|
|
11
|
-
import { mcpLog, formatSuccess, formatError, formatBatchHeader, formatDuration, truncateText, TOKEN_BUDGETS, calculateTokenAllocation, } from './utils.js';
|
|
12
|
-
// Constants
|
|
13
|
-
const MIN_QUESTIONS = 1; // Allow single question for flexibility
|
|
14
|
-
const MAX_QUESTIONS = 10;
|
|
15
|
-
const SYSTEM_PROMPT = `Expert research engine. Multi-source: docs, papers, blogs, case studies. Cite inline [source].
|
|
16
|
-
|
|
17
|
-
FORMAT RULES:
|
|
18
|
-
- For comparisons/features/structured data → use markdown table |Col|Col|Col|
|
|
19
|
-
- For narrative/diagnostic/explanation → tight numbered bullets, no prose paragraphs
|
|
20
|
-
- No intro, no greeting, no conclusion, no meta-commentary
|
|
21
|
-
- No filler phrases: "it is worth noting", "overall", "in conclusion", "importantly"
|
|
22
|
-
- Every sentence = fact, data point, or actionable insight
|
|
23
|
-
- First line of output = content (never a preamble)`;
|
|
24
|
-
// Get research suffix from YAML config (fallback to hardcoded)
|
|
25
|
-
function getResearchSuffix() {
|
|
26
|
-
const config = getToolConfig('deep_research');
|
|
27
|
-
const suffix = config?.limits?.research_suffix;
|
|
28
|
-
return typeof suffix === 'string' ? suffix : RESEARCH_PROMPTS.SUFFIX;
|
|
29
|
-
}
|
|
30
|
-
function wrapQuestionWithCompression(question) {
|
|
31
|
-
return `${question}\n\n${getResearchSuffix()}`;
|
|
32
|
-
}
|
|
33
|
-
// --- Helpers ---
|
|
34
|
-
function validateQuestionCount(count) {
|
|
35
|
-
if (count < MIN_QUESTIONS) {
|
|
36
|
-
return {
|
|
37
|
-
code: 'MIN_QUESTIONS',
|
|
38
|
-
message: `Minimum ${MIN_QUESTIONS} research question(s) required. Received: ${count}`,
|
|
39
|
-
howToFix: ['Add at least one question with detailed context following the template: WHAT I NEED, WHY, WHAT I KNOW, SPECIFIC QUESTIONS'],
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
if (count > MAX_QUESTIONS) {
|
|
43
|
-
return {
|
|
44
|
-
code: 'MAX_QUESTIONS',
|
|
45
|
-
message: `Maximum ${MAX_QUESTIONS} research questions allowed. Received: ${count}`,
|
|
46
|
-
howToFix: [`Remove ${count - MAX_QUESTIONS} question(s)`],
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
async function enhanceQuestionWithAttachments(question, fileAttachments, fileService, index) {
|
|
52
|
-
if (!fileAttachments || fileAttachments.length === 0)
|
|
53
|
-
return question;
|
|
54
|
-
try {
|
|
55
|
-
const attachmentsMarkdown = await fileService.formatAttachments(fileAttachments);
|
|
56
|
-
return question + attachmentsMarkdown;
|
|
57
|
-
}
|
|
58
|
-
catch {
|
|
59
|
-
mcpLog('warning', `Failed to process attachments for question ${index + 1}`, 'research');
|
|
60
|
-
return question;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
async function executeResearchQuestions(questions, client, fileService, tokensPerQuestion) {
|
|
64
|
-
return pMap(questions, async (q, index) => {
|
|
65
|
-
try {
|
|
66
|
-
let enhancedQuestion = await enhanceQuestionWithAttachments(q.question, q.file_attachments, fileService, index);
|
|
67
|
-
enhancedQuestion = wrapQuestionWithCompression(enhancedQuestion);
|
|
68
|
-
const response = await client.research({
|
|
69
|
-
question: enhancedQuestion,
|
|
70
|
-
systemPrompt: SYSTEM_PROMPT,
|
|
71
|
-
reasoningEffort: RESEARCH.REASONING_EFFORT,
|
|
72
|
-
maxSearchResults: Math.min(RESEARCH.MAX_URLS, 20),
|
|
73
|
-
maxTokens: tokensPerQuestion,
|
|
74
|
-
});
|
|
75
|
-
if (response.error) {
|
|
76
|
-
return { question: q.question, content: response.content || '', success: false, error: response.error.message };
|
|
77
|
-
}
|
|
78
|
-
return {
|
|
79
|
-
question: q.question,
|
|
80
|
-
content: response.content || '',
|
|
81
|
-
success: !!response.content,
|
|
82
|
-
tokensUsed: response.usage?.totalTokens,
|
|
83
|
-
error: response.content ? undefined : 'Empty response received',
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
const structuredError = classifyError(error);
|
|
88
|
-
return { question: q.question, content: '', success: false, error: structuredError.message };
|
|
89
|
-
}
|
|
90
|
-
}, 3);
|
|
91
|
-
}
|
|
92
|
-
function buildQuestionsData(results) {
|
|
93
|
-
const sections = [];
|
|
94
|
-
for (let i = 0; i < results.length; i++) {
|
|
95
|
-
const r = results[i];
|
|
96
|
-
if (!r)
|
|
97
|
-
continue;
|
|
98
|
-
const preview = truncateText(r.question, 100);
|
|
99
|
-
sections.push(`## Question ${i + 1}: ${preview}\n`);
|
|
100
|
-
if (r.success) {
|
|
101
|
-
sections.push(r.content);
|
|
102
|
-
if (r.tokensUsed)
|
|
103
|
-
sections.push(`\n*Tokens used: ${r.tokensUsed.toLocaleString()}*`);
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
sections.push(`**❌ Error:** ${r.error}`);
|
|
107
|
-
}
|
|
108
|
-
sections.push('\n---\n');
|
|
109
|
-
}
|
|
110
|
-
return sections.join('\n');
|
|
111
|
-
}
|
|
112
|
-
function formatResearchOutput(results, totalQuestions, tokensPerQuestion, executionTime) {
|
|
113
|
-
const successful = results.filter(r => r.success);
|
|
114
|
-
const failed = results.filter(r => !r.success);
|
|
115
|
-
const totalTokens = successful.reduce((sum, r) => sum + (r.tokensUsed || 0), 0);
|
|
116
|
-
const batchHeader = formatBatchHeader({
|
|
117
|
-
title: `Deep Research Results`,
|
|
118
|
-
totalItems: totalQuestions,
|
|
119
|
-
successful: successful.length,
|
|
120
|
-
failed: failed.length,
|
|
121
|
-
tokensPerItem: tokensPerQuestion,
|
|
122
|
-
extras: { 'Total tokens used': totalTokens.toLocaleString() },
|
|
123
|
-
});
|
|
124
|
-
const nextSteps = [
|
|
125
|
-
successful.length > 0 ? 'SCRAPE CITED SOURCES: scrape_links(urls=[...URLs cited in research above...], use_llm=true, what_to_extract="Extract evidence | data | methodology | conclusions") — verify research citations with primary sources' : null,
|
|
126
|
-
successful.length > 0 ? 'COMMUNITY VALIDATION: search_reddit(queries=["topic findings", "topic real experience", "topic criticism"]) — check if community agrees with research findings' : null,
|
|
127
|
-
successful.length > 0 ? 'ITERATE: If research revealed gaps or new questions, run deep_research again with refined questions targeting those gaps' : null,
|
|
128
|
-
successful.length > 0 ? 'WEB VERIFY: web_search(keywords=["specific claim from research", "topic latest data 2025"]) — if claims need independent verification' : null,
|
|
129
|
-
failed.length > 0 ? 'Retry failed questions with more specific context' : null,
|
|
130
|
-
].filter(Boolean);
|
|
131
|
-
const formattedContent = formatSuccess({
|
|
132
|
-
title: `Research Complete (${successful.length}/${totalQuestions})`,
|
|
133
|
-
summary: batchHeader,
|
|
134
|
-
data: buildQuestionsData(results),
|
|
135
|
-
nextSteps,
|
|
136
|
-
metadata: {
|
|
137
|
-
'Execution time': formatDuration(executionTime),
|
|
138
|
-
'Token budget': TOKEN_BUDGETS.RESEARCH.toLocaleString(),
|
|
139
|
-
},
|
|
140
|
-
});
|
|
141
|
-
return {
|
|
142
|
-
content: formattedContent,
|
|
143
|
-
structuredContent: {
|
|
144
|
-
totalQuestions,
|
|
145
|
-
successful: successful.length,
|
|
146
|
-
failed: failed.length,
|
|
147
|
-
tokensPerQuestion,
|
|
148
|
-
totalTokensUsed: totalTokens,
|
|
149
|
-
results,
|
|
150
|
-
},
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Handle deep research request
|
|
155
|
-
* NEVER throws - always returns a valid response
|
|
156
|
-
*/
|
|
157
|
-
export async function handleDeepResearch(params) {
|
|
158
|
-
const startTime = Date.now();
|
|
159
|
-
const questions = params.questions || [];
|
|
160
|
-
const validationError = validateQuestionCount(questions.length);
|
|
161
|
-
if (validationError) {
|
|
162
|
-
return {
|
|
163
|
-
content: formatError({ ...validationError, toolName: 'deep_research' }),
|
|
164
|
-
structuredContent: { error: true, message: validationError.message },
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
const tokensPerQuestion = calculateTokenAllocation(questions.length, TOKEN_BUDGETS.RESEARCH);
|
|
168
|
-
mcpLog('info', `Starting batch research: ${questions.length} questions, ${tokensPerQuestion.toLocaleString()} tokens/question`, 'research');
|
|
169
|
-
let client;
|
|
170
|
-
try {
|
|
171
|
-
client = new ResearchClient();
|
|
172
|
-
}
|
|
173
|
-
catch (error) {
|
|
174
|
-
const err = classifyError(error);
|
|
175
|
-
return {
|
|
176
|
-
content: formatError({
|
|
177
|
-
code: 'CLIENT_INIT_FAILED',
|
|
178
|
-
message: `Failed to initialize research client: ${err.message}`,
|
|
179
|
-
toolName: 'deep_research',
|
|
180
|
-
howToFix: ['Check OPENROUTER_API_KEY is set'],
|
|
181
|
-
alternatives: [
|
|
182
|
-
'web_search(keywords=["topic best practices", "topic guide", "topic comparison 2025"]) — uses Serper API (different key), search for information directly',
|
|
183
|
-
'search_reddit(queries=["topic recommendations", "topic experience", "topic discussion"]) — uses Serper API, get community perspective',
|
|
184
|
-
'scrape_links(urls=[...any relevant URLs...], use_llm=true) — if you have URLs, scrape them for content (uses Firecrawl + OpenRouter, may also fail if OpenRouter key is the issue)',
|
|
185
|
-
],
|
|
186
|
-
}),
|
|
187
|
-
structuredContent: { error: true, message: `Failed to initialize: ${err.message}` },
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
const fileService = new FileAttachmentService();
|
|
191
|
-
const results = await executeResearchQuestions(questions, client, fileService, tokensPerQuestion);
|
|
192
|
-
const executionTime = Date.now() - startTime;
|
|
193
|
-
mcpLog('info', `Research completed: ${results.filter(r => r.success).length}/${questions.length} successful, ${results.filter(r => r.success).reduce((s, r) => s + (r.tokensUsed || 0), 0).toLocaleString()} tokens`, 'research');
|
|
194
|
-
return formatResearchOutput(results, questions.length, tokensPerQuestion, executionTime);
|
|
195
|
-
}
|
|
196
|
-
//# sourceMappingURL=research.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/scrape.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Scrape Links Tool Handler
|
|
3
|
-
* Implements robust error handling that NEVER crashes the MCP server
|
|
4
|
-
*/
|
|
5
|
-
import type { ScrapeLinksParams, ScrapeLinksOutput } from '../schemas/scrape-links.js';
|
|
6
|
-
/**
|
|
7
|
-
* Handle scrape links request
|
|
8
|
-
* NEVER throws - always returns a valid response with content and metadata
|
|
9
|
-
*/
|
|
10
|
-
export declare function handleScrapeLinks(params: ScrapeLinksParams): Promise<{
|
|
11
|
-
content: string;
|
|
12
|
-
structuredContent: ScrapeLinksOutput;
|
|
13
|
-
}>;
|
|
14
|
-
//# sourceMappingURL=scrape.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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;AA2RvF;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAoDpE"}
|