mcp-researchpowerpack 3.6.9
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 +635 -0
- package/dist/clients/reddit.d.ts +74 -0
- package/dist/clients/reddit.d.ts.map +1 -0
- package/dist/clients/reddit.js +305 -0
- package/dist/clients/reddit.js.map +1 -0
- package/dist/clients/research.d.ts +67 -0
- package/dist/clients/research.d.ts.map +1 -0
- package/dist/clients/research.js +252 -0
- package/dist/clients/research.js.map +1 -0
- package/dist/clients/scraper.d.ts +71 -0
- package/dist/clients/scraper.d.ts.map +1 -0
- package/dist/clients/scraper.js +321 -0
- package/dist/clients/scraper.js.map +1 -0
- package/dist/clients/search.d.ts +62 -0
- package/dist/clients/search.d.ts.map +1 -0
- package/dist/clients/search.js +219 -0
- package/dist/clients/search.js.map +1 -0
- package/dist/config/index.d.ts +62 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +142 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +40 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +305 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +81 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +6 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/yaml/tools.yaml +130 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +271 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/deep-research.d.ts +64 -0
- package/dist/schemas/deep-research.d.ts.map +1 -0
- package/dist/schemas/deep-research.js +224 -0
- package/dist/schemas/deep-research.js.map +1 -0
- package/dist/schemas/scrape-links.d.ts +32 -0
- package/dist/schemas/scrape-links.d.ts.map +1 -0
- package/dist/schemas/scrape-links.js +34 -0
- package/dist/schemas/scrape-links.js.map +1 -0
- package/dist/schemas/web-search.d.ts +22 -0
- package/dist/schemas/web-search.d.ts.map +1 -0
- package/dist/schemas/web-search.js +21 -0
- package/dist/schemas/web-search.js.map +1 -0
- package/dist/services/file-attachment.d.ts +30 -0
- package/dist/services/file-attachment.d.ts.map +1 -0
- package/dist/services/file-attachment.js +199 -0
- package/dist/services/file-attachment.js.map +1 -0
- package/dist/services/llm-processor.d.ts +27 -0
- package/dist/services/llm-processor.d.ts.map +1 -0
- package/dist/services/llm-processor.js +179 -0
- package/dist/services/llm-processor.js.map +1 -0
- package/dist/services/markdown-cleaner.d.ts +8 -0
- package/dist/services/markdown-cleaner.d.ts.map +1 -0
- package/dist/services/markdown-cleaner.js +44 -0
- package/dist/services/markdown-cleaner.js.map +1 -0
- package/dist/tools/definitions.d.ts +16 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +17 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/reddit.d.ts +14 -0
- package/dist/tools/reddit.d.ts.map +1 -0
- package/dist/tools/reddit.js +213 -0
- package/dist/tools/reddit.js.map +1 -0
- package/dist/tools/registry.d.ts +71 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +242 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/research.d.ts +14 -0
- package/dist/tools/research.d.ts.map +1 -0
- package/dist/tools/research.js +194 -0
- package/dist/tools/research.js.map +1 -0
- package/dist/tools/scrape.d.ts +14 -0
- package/dist/tools/scrape.d.ts.map +1 -0
- package/dist/tools/scrape.js +201 -0
- package/dist/tools/scrape.js.map +1 -0
- package/dist/tools/search.d.ts +10 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +137 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/utils.d.ts +105 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +159 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/utils/concurrency.d.ts +29 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +73 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/errors.d.ts +77 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +335 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +39 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +57 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown-formatter.d.ts +5 -0
- package/dist/utils/markdown-formatter.d.ts.map +1 -0
- package/dist/utils/markdown-formatter.js +15 -0
- package/dist/utils/markdown-formatter.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/dist/utils/url-aggregator.d.ts +90 -0
- package/dist/utils/url-aggregator.d.ts.map +1 -0
- package/dist/utils/url-aggregator.js +502 -0
- package/dist/utils/url-aggregator.js.map +1 -0
- package/dist/version.d.ts +30 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +60 -0
- package/dist/version.js.map +1 -0
- package/dist/worker.d.ts +17 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +53 -0
- package/dist/worker.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Response Formatters - 70/20/10 Pattern
|
|
3
|
+
*
|
|
4
|
+
* All tool responses should follow this structure:
|
|
5
|
+
* - 70% Summary: Key insights, status, metrics
|
|
6
|
+
* - 20% Data: Structured results (lists, tables)
|
|
7
|
+
* - 10% Next Steps: Actionable follow-up commands
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Format a successful response using 70/20/10 pattern
|
|
11
|
+
*/
|
|
12
|
+
export function formatSuccess(opts) {
|
|
13
|
+
const parts = [];
|
|
14
|
+
// Title
|
|
15
|
+
parts.push(`✓ ${opts.title}`);
|
|
16
|
+
parts.push('');
|
|
17
|
+
// Summary (70%)
|
|
18
|
+
parts.push(opts.summary);
|
|
19
|
+
// Data section (20%)
|
|
20
|
+
if (opts.data) {
|
|
21
|
+
parts.push('');
|
|
22
|
+
parts.push('---');
|
|
23
|
+
parts.push(opts.data);
|
|
24
|
+
}
|
|
25
|
+
// Next steps (10%)
|
|
26
|
+
if (opts.nextSteps?.length) {
|
|
27
|
+
parts.push('');
|
|
28
|
+
parts.push('---');
|
|
29
|
+
parts.push('**Next Steps:**');
|
|
30
|
+
opts.nextSteps.forEach(step => parts.push(`→ ${step}`));
|
|
31
|
+
}
|
|
32
|
+
// Metadata footer
|
|
33
|
+
if (opts.metadata && Object.keys(opts.metadata).length > 0) {
|
|
34
|
+
parts.push('');
|
|
35
|
+
parts.push('---');
|
|
36
|
+
const metaStr = Object.entries(opts.metadata)
|
|
37
|
+
.map(([k, v]) => `${k}: ${v}`)
|
|
38
|
+
.join(' | ');
|
|
39
|
+
parts.push(`*${metaStr}*`);
|
|
40
|
+
}
|
|
41
|
+
return parts.join('\n');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Format an error response with recovery guidance
|
|
45
|
+
*/
|
|
46
|
+
export function formatError(opts) {
|
|
47
|
+
const parts = [];
|
|
48
|
+
// Error header
|
|
49
|
+
const prefix = opts.toolName ? `[${opts.toolName}] ` : '';
|
|
50
|
+
parts.push(`❌ ${prefix}${opts.code}: ${opts.message}`);
|
|
51
|
+
// Retryable hint
|
|
52
|
+
if (opts.retryable) {
|
|
53
|
+
parts.push('');
|
|
54
|
+
parts.push('*This error is retryable. Wait a moment and try again.*');
|
|
55
|
+
}
|
|
56
|
+
// How to fix
|
|
57
|
+
if (opts.howToFix?.length) {
|
|
58
|
+
parts.push('');
|
|
59
|
+
parts.push('**How to Fix:**');
|
|
60
|
+
opts.howToFix.forEach((step, i) => parts.push(`${i + 1}. ${step}`));
|
|
61
|
+
}
|
|
62
|
+
// Alternatives
|
|
63
|
+
if (opts.alternatives?.length) {
|
|
64
|
+
parts.push('');
|
|
65
|
+
parts.push('**Alternatives:**');
|
|
66
|
+
opts.alternatives.forEach(alt => parts.push(`• ${alt}`));
|
|
67
|
+
}
|
|
68
|
+
return parts.join('\n');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Format a batch operation header with stats
|
|
72
|
+
*/
|
|
73
|
+
export function formatBatchHeader(opts) {
|
|
74
|
+
const parts = [];
|
|
75
|
+
// Title with emoji based on success rate
|
|
76
|
+
const successRate = opts.totalItems > 0 ? opts.successful / opts.totalItems : 0;
|
|
77
|
+
const emoji = successRate === 1 ? '✓' : successRate >= 0.5 ? '⚠️' : '❌';
|
|
78
|
+
parts.push(`${emoji} ${opts.title}`);
|
|
79
|
+
parts.push('');
|
|
80
|
+
// Stats
|
|
81
|
+
parts.push(`• Total: ${opts.totalItems}`);
|
|
82
|
+
parts.push(`• Successful: ${opts.successful}`);
|
|
83
|
+
if (opts.failed > 0) {
|
|
84
|
+
parts.push(`• Failed: ${opts.failed}`);
|
|
85
|
+
}
|
|
86
|
+
if (opts.tokensPerItem) {
|
|
87
|
+
parts.push(`• Tokens/item: ~${opts.tokensPerItem.toLocaleString()}`);
|
|
88
|
+
}
|
|
89
|
+
if (opts.batches) {
|
|
90
|
+
parts.push(`• Batches: ${opts.batches}`);
|
|
91
|
+
}
|
|
92
|
+
// Extra stats
|
|
93
|
+
if (opts.extras) {
|
|
94
|
+
Object.entries(opts.extras).forEach(([key, val]) => {
|
|
95
|
+
parts.push(`• ${key}: ${val}`);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return parts.join('\n');
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Format a numbered list with optional metadata
|
|
102
|
+
*/
|
|
103
|
+
export function formatList(items, options) {
|
|
104
|
+
const max = options?.maxItems ?? 20;
|
|
105
|
+
const numbered = options?.numbered ?? true;
|
|
106
|
+
const toShow = items.slice(0, max);
|
|
107
|
+
const remaining = items.length - max;
|
|
108
|
+
const lines = toShow.map((item, i) => {
|
|
109
|
+
const prefix = numbered ? `${i + 1}. ` : '• ';
|
|
110
|
+
let line = `${prefix}**${item.title}**`;
|
|
111
|
+
if (item.meta) {
|
|
112
|
+
line += ` (${item.meta})`;
|
|
113
|
+
}
|
|
114
|
+
if (item.description) {
|
|
115
|
+
line += `\n ${item.description}`;
|
|
116
|
+
}
|
|
117
|
+
if (item.url) {
|
|
118
|
+
line += `\n ${item.url}`;
|
|
119
|
+
}
|
|
120
|
+
return line;
|
|
121
|
+
});
|
|
122
|
+
if (remaining > 0) {
|
|
123
|
+
lines.push(`\n*...and ${remaining} more*`);
|
|
124
|
+
}
|
|
125
|
+
return lines.join('\n');
|
|
126
|
+
}
|
|
127
|
+
// ============================================================================
|
|
128
|
+
// Duration Formatter
|
|
129
|
+
// ============================================================================
|
|
130
|
+
/**
|
|
131
|
+
* Format duration in human-readable form
|
|
132
|
+
*/
|
|
133
|
+
export function formatDuration(ms) {
|
|
134
|
+
if (ms < 1000)
|
|
135
|
+
return `${ms}ms`;
|
|
136
|
+
if (ms < 60000)
|
|
137
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
138
|
+
return `${(ms / 60000).toFixed(1)}m`;
|
|
139
|
+
}
|
|
140
|
+
// ============================================================================
|
|
141
|
+
// Text Truncation
|
|
142
|
+
// ============================================================================
|
|
143
|
+
/**
|
|
144
|
+
* Truncate text to max length with ellipsis
|
|
145
|
+
*/
|
|
146
|
+
export function truncateText(text, maxLength) {
|
|
147
|
+
if (text.length <= maxLength)
|
|
148
|
+
return text;
|
|
149
|
+
return text.slice(0, maxLength - 3) + '...';
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL Aggregator Utility
|
|
3
|
+
* Aggregates search results across multiple queries, calculates CTR-weighted scores,
|
|
4
|
+
* and generates consensus-based rankings.
|
|
5
|
+
*/
|
|
6
|
+
import type { KeywordSearchResult, RedditSearchResult } from '../clients/search.js';
|
|
7
|
+
/**
|
|
8
|
+
* Ranked URL with normalized score
|
|
9
|
+
*/
|
|
10
|
+
interface RankedUrl {
|
|
11
|
+
url: string;
|
|
12
|
+
title: string;
|
|
13
|
+
snippet: string;
|
|
14
|
+
rank: number;
|
|
15
|
+
score: number;
|
|
16
|
+
frequency: number;
|
|
17
|
+
positions: number[];
|
|
18
|
+
queries: string[];
|
|
19
|
+
bestPosition: number;
|
|
20
|
+
isConsensus: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Aggregation result containing all processed data
|
|
24
|
+
*/
|
|
25
|
+
interface AggregationResult {
|
|
26
|
+
rankedUrls: RankedUrl[];
|
|
27
|
+
totalUniqueUrls: number;
|
|
28
|
+
totalQueries: number;
|
|
29
|
+
frequencyThreshold: number;
|
|
30
|
+
thresholdNote?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Mark consensus status for a URL
|
|
34
|
+
* Returns "✓" if frequency >= 3, else "✗"
|
|
35
|
+
*/
|
|
36
|
+
export declare function markConsensus(frequency: number): string;
|
|
37
|
+
/**
|
|
38
|
+
* Generate enhanced narrative output for consensus URLs
|
|
39
|
+
*/
|
|
40
|
+
export declare function generateEnhancedOutput(rankedUrls: RankedUrl[], allKeywords: string[], totalUniqueUrls: number, frequencyThreshold: number, thresholdNote?: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Full aggregation pipeline with fallback thresholds
|
|
43
|
+
* Tries ≥3, falls back to ≥2, then ≥1 if needed
|
|
44
|
+
*/
|
|
45
|
+
export declare function aggregateAndRank(searches: KeywordSearchResult[], minConsensusUrls?: number): AggregationResult;
|
|
46
|
+
/**
|
|
47
|
+
* Build URL lookup map for quick consensus checking during result formatting
|
|
48
|
+
*/
|
|
49
|
+
export declare function buildUrlLookup(rankedUrls: RankedUrl[]): Map<string, RankedUrl>;
|
|
50
|
+
/**
|
|
51
|
+
* Look up a URL in the ranked results
|
|
52
|
+
*/
|
|
53
|
+
export declare function lookupUrl(url: string, lookup: Map<string, RankedUrl>): RankedUrl | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* Ranked Reddit URL with normalized score
|
|
56
|
+
*/
|
|
57
|
+
interface RankedRedditUrl {
|
|
58
|
+
url: string;
|
|
59
|
+
title: string;
|
|
60
|
+
snippet: string;
|
|
61
|
+
date?: string;
|
|
62
|
+
rank: number;
|
|
63
|
+
score: number;
|
|
64
|
+
frequency: number;
|
|
65
|
+
positions: number[];
|
|
66
|
+
queries: string[];
|
|
67
|
+
bestPosition: number;
|
|
68
|
+
isConsensus: boolean;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Reddit aggregation result
|
|
72
|
+
*/
|
|
73
|
+
interface RedditAggregationResult {
|
|
74
|
+
rankedUrls: RankedRedditUrl[];
|
|
75
|
+
totalUniqueUrls: number;
|
|
76
|
+
totalQueries: number;
|
|
77
|
+
frequencyThreshold: number;
|
|
78
|
+
thresholdNote?: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Full Reddit aggregation pipeline with fallback thresholds
|
|
82
|
+
*/
|
|
83
|
+
export declare function aggregateAndRankReddit(searches: Map<string, RedditSearchResult[]>, minConsensusUrls?: number): RedditAggregationResult;
|
|
84
|
+
/**
|
|
85
|
+
* Generate enhanced output for Reddit aggregated results
|
|
86
|
+
* Now includes both aggregated view AND per-query raw results
|
|
87
|
+
*/
|
|
88
|
+
export declare function generateRedditEnhancedOutput(aggregation: RedditAggregationResult, allQueries: string[], rawResults?: Map<string, RedditSearchResult[]>): string;
|
|
89
|
+
export {};
|
|
90
|
+
//# sourceMappingURL=url-aggregator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-aggregator.d.ts","sourceRoot":"","sources":["../../src/utils/url-aggregator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAgBpF;;GAEG;AACH,UAAU,SAAS;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,UAAU,iBAAiB;IACzB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAsHD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAyBD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,SAAS,EAAE,EACvB,WAAW,EAAE,MAAM,EAAE,EACrB,eAAe,EAAE,MAAM,EACvB,kBAAkB,EAAE,MAAM,EAC1B,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAgGR;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,gBAAgB,GAAE,MAAU,GAC3B,iBAAiB,CA+BnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAW9E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,GAAG,SAAS,CAG5F;AAqBD;;GAEG;AACH,UAAU,eAAe;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,UAAU,uBAAuB;IAC/B,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA+FD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,EAC3C,gBAAgB,GAAE,MAAU,GAC3B,uBAAuB,CA+BzB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,uBAAuB,EACpC,UAAU,EAAE,MAAM,EAAE,EACpB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,GAC7C,MAAM,CAkIR"}
|