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,502 @@
|
|
|
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 { CTR_WEIGHTS } from '../config/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Get CTR weight for a position (1-10)
|
|
9
|
+
* Positions beyond 10 get minimal weight
|
|
10
|
+
*/
|
|
11
|
+
function getCtrWeight(position) {
|
|
12
|
+
if (position >= 1 && position <= 10) {
|
|
13
|
+
return CTR_WEIGHTS[position] ?? 0;
|
|
14
|
+
}
|
|
15
|
+
// Positions beyond 10 get diminishing returns
|
|
16
|
+
return Math.max(0, 10 - (position - 10) * 0.5);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Aggregate results from multiple searches
|
|
20
|
+
* Flattens all results, deduplicates by URL, and tracks frequency/positions
|
|
21
|
+
*/
|
|
22
|
+
function aggregateResults(searches) {
|
|
23
|
+
const urlMap = new Map();
|
|
24
|
+
for (const search of searches) {
|
|
25
|
+
for (const result of search.results) {
|
|
26
|
+
const normalizedUrl = normalizeUrl(result.link);
|
|
27
|
+
const existing = urlMap.get(normalizedUrl);
|
|
28
|
+
if (existing) {
|
|
29
|
+
existing.frequency += 1;
|
|
30
|
+
existing.positions.push(result.position);
|
|
31
|
+
existing.queries.push(search.keyword);
|
|
32
|
+
const prevBest = existing.bestPosition;
|
|
33
|
+
existing.bestPosition = Math.min(existing.bestPosition, result.position);
|
|
34
|
+
existing.totalScore += getCtrWeight(result.position);
|
|
35
|
+
// Keep best title/snippet (from highest ranking position)
|
|
36
|
+
if (result.position < prevBest) {
|
|
37
|
+
existing.title = result.title;
|
|
38
|
+
existing.snippet = result.snippet;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
urlMap.set(normalizedUrl, {
|
|
43
|
+
url: result.link,
|
|
44
|
+
title: result.title,
|
|
45
|
+
snippet: result.snippet,
|
|
46
|
+
frequency: 1,
|
|
47
|
+
positions: [result.position],
|
|
48
|
+
queries: [search.keyword],
|
|
49
|
+
bestPosition: result.position,
|
|
50
|
+
totalScore: getCtrWeight(result.position),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return urlMap;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Normalize URL for deduplication
|
|
59
|
+
* Removes trailing slashes, www prefix, and normalizes protocol
|
|
60
|
+
*/
|
|
61
|
+
function normalizeUrl(url) {
|
|
62
|
+
try {
|
|
63
|
+
const parsed = new URL(url);
|
|
64
|
+
let host = parsed.hostname.replace(/^www\./, '');
|
|
65
|
+
let path = parsed.pathname.replace(/\/$/, '') || '/';
|
|
66
|
+
return `${host}${path}${parsed.search}`.toLowerCase();
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return url.toLowerCase().replace(/\/$/, '');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Filter URLs by minimum frequency
|
|
74
|
+
* Returns URLs appearing in at least minFrequency searches
|
|
75
|
+
*/
|
|
76
|
+
function filterByFrequency(urlMap, minFrequency) {
|
|
77
|
+
const filtered = [];
|
|
78
|
+
for (const url of urlMap.values()) {
|
|
79
|
+
if (url.frequency >= minFrequency) {
|
|
80
|
+
filtered.push(url);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return filtered;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Calculate weighted scores and normalize to 100.0
|
|
87
|
+
* Returns sorted array with rank assignments
|
|
88
|
+
*/
|
|
89
|
+
function calculateWeightedScores(urls) {
|
|
90
|
+
if (urls.length === 0)
|
|
91
|
+
return [];
|
|
92
|
+
// Sort by total score descending
|
|
93
|
+
const sorted = [...urls].sort((a, b) => b.totalScore - a.totalScore);
|
|
94
|
+
// Find max score for normalization
|
|
95
|
+
const maxScore = sorted[0].totalScore;
|
|
96
|
+
// Map to ranked URLs with normalized scores
|
|
97
|
+
return sorted.map((url, index) => ({
|
|
98
|
+
url: url.url,
|
|
99
|
+
title: url.title,
|
|
100
|
+
snippet: url.snippet,
|
|
101
|
+
rank: index + 1,
|
|
102
|
+
score: maxScore > 0 ? (url.totalScore / maxScore) * 100 : 0,
|
|
103
|
+
frequency: url.frequency,
|
|
104
|
+
positions: url.positions,
|
|
105
|
+
queries: url.queries,
|
|
106
|
+
bestPosition: url.bestPosition,
|
|
107
|
+
isConsensus: url.frequency >= 3,
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Mark consensus status for a URL
|
|
112
|
+
* Returns "✓" if frequency >= 3, else "✗"
|
|
113
|
+
*/
|
|
114
|
+
export function markConsensus(frequency) {
|
|
115
|
+
return frequency >= 3 ? '✓' : '✗';
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Generate justification for why a URL is ranked at its position
|
|
119
|
+
*/
|
|
120
|
+
function generateJustification(url, rank) {
|
|
121
|
+
const parts = [];
|
|
122
|
+
if (url.frequency >= 4) {
|
|
123
|
+
parts.push(`Appeared in ${url.frequency} different searches showing strong cross-query relevance`);
|
|
124
|
+
}
|
|
125
|
+
else if (url.frequency >= 3) {
|
|
126
|
+
parts.push(`Found across ${url.frequency} searches indicating solid topical coverage`);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
parts.push(`Appeared in ${url.frequency} search${url.frequency > 1 ? 'es' : ''}`);
|
|
130
|
+
}
|
|
131
|
+
if (url.bestPosition === 1) {
|
|
132
|
+
parts.push('ranked #1 in at least one search');
|
|
133
|
+
}
|
|
134
|
+
else if (url.bestPosition <= 3) {
|
|
135
|
+
parts.push(`best position was top-3 (#${url.bestPosition})`);
|
|
136
|
+
}
|
|
137
|
+
return parts.join(', ') + '.';
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Generate enhanced narrative output for consensus URLs
|
|
141
|
+
*/
|
|
142
|
+
export function generateEnhancedOutput(rankedUrls, allKeywords, totalUniqueUrls, frequencyThreshold, thresholdNote) {
|
|
143
|
+
const lines = [];
|
|
144
|
+
// Header
|
|
145
|
+
lines.push(`## The Perfect Search Results (Aggregated from ${allKeywords.length} Queries)`);
|
|
146
|
+
lines.push('');
|
|
147
|
+
lines.push(`Based on ${allKeywords.length} distinct searches, we identified **${rankedUrls.length} high-consensus resources**. Here's what the data reveals:`);
|
|
148
|
+
lines.push('');
|
|
149
|
+
if (thresholdNote) {
|
|
150
|
+
lines.push(`> ${thresholdNote}`);
|
|
151
|
+
lines.push('');
|
|
152
|
+
}
|
|
153
|
+
// Top Consensus Resources
|
|
154
|
+
lines.push('### 🥇 Top Consensus Resources');
|
|
155
|
+
lines.push('');
|
|
156
|
+
for (const url of rankedUrls.slice(0, 20)) {
|
|
157
|
+
const highConsensus = url.frequency >= 4 ? ' ⭐ HIGHEST CONSENSUS' : '';
|
|
158
|
+
lines.push(`#### #${url.rank}: ${url.title} (Score: ${url.score.toFixed(1)})${highConsensus}`);
|
|
159
|
+
// Appeared in queries
|
|
160
|
+
const queriesList = url.queries.map(q => `"${q}"`).join(', ');
|
|
161
|
+
lines.push(`- **Appeared in:** ${url.frequency} queries (${queriesList})`);
|
|
162
|
+
// Best ranking
|
|
163
|
+
lines.push(`- **Best ranking:** Position ${url.bestPosition}`);
|
|
164
|
+
// Description (truncated snippet)
|
|
165
|
+
const description = url.snippet.length > 200
|
|
166
|
+
? url.snippet.substring(0, 197) + '...'
|
|
167
|
+
: url.snippet;
|
|
168
|
+
lines.push(`- **Description:** ${description}`);
|
|
169
|
+
// Justification
|
|
170
|
+
lines.push(`- **Why it's #${url.rank}:** ${generateJustification(url, url.rank)}`);
|
|
171
|
+
// URL
|
|
172
|
+
lines.push(`- **URL:** ${url.url}`);
|
|
173
|
+
lines.push('');
|
|
174
|
+
}
|
|
175
|
+
// Metadata section
|
|
176
|
+
lines.push('---');
|
|
177
|
+
lines.push('');
|
|
178
|
+
lines.push('### 📈 Metadata');
|
|
179
|
+
lines.push('');
|
|
180
|
+
lines.push(`- **Total Queries:** ${allKeywords.length} (${allKeywords.join(', ')})`);
|
|
181
|
+
// Sort all URLs by frequency for the unique URLs list
|
|
182
|
+
const sortedByFreq = [...rankedUrls].sort((a, b) => b.frequency - a.frequency);
|
|
183
|
+
const urlFreqList = sortedByFreq
|
|
184
|
+
.slice(0, 30)
|
|
185
|
+
.map(u => {
|
|
186
|
+
const shortUrl = u.url.length > 40 ? u.url.substring(0, 37) + '...' : u.url;
|
|
187
|
+
return `${shortUrl} (${u.frequency}x)`;
|
|
188
|
+
})
|
|
189
|
+
.join(', ');
|
|
190
|
+
lines.push(`- **Unique URLs Found:** ${totalUniqueUrls} — top by frequency: ${urlFreqList}`);
|
|
191
|
+
lines.push(`- **Consensus Threshold:** ≥${frequencyThreshold} appearances`);
|
|
192
|
+
lines.push('');
|
|
193
|
+
// Next Steps - actionable follow-up commands
|
|
194
|
+
lines.push('---');
|
|
195
|
+
lines.push('');
|
|
196
|
+
lines.push('### ➡️ Next Steps');
|
|
197
|
+
lines.push('');
|
|
198
|
+
// Generate URL list for scrape_links command
|
|
199
|
+
const topUrls = rankedUrls.slice(0, Math.min(5, rankedUrls.length));
|
|
200
|
+
if (topUrls.length > 0) {
|
|
201
|
+
const urlList = topUrls.map(u => `"${u.url}"`).join(', ');
|
|
202
|
+
lines.push(`**Scrape top consensus URLs for full content:**`);
|
|
203
|
+
lines.push('```');
|
|
204
|
+
lines.push(`scrape_links(urls=[${urlList}], use_llm=true, what_to_extract="Extract key insights, recommendations, and actionable information")`);
|
|
205
|
+
lines.push('```');
|
|
206
|
+
lines.push('');
|
|
207
|
+
}
|
|
208
|
+
// Reddit follow-up
|
|
209
|
+
lines.push(`**Get community perspective from Reddit:**`);
|
|
210
|
+
lines.push('```');
|
|
211
|
+
lines.push(`search_reddit(queries=["${allKeywords[0] || 'topic'} reddit", "${allKeywords[0] || 'topic'} recommendations", "${allKeywords[0] || 'topic'} best practices"])`);
|
|
212
|
+
lines.push('```');
|
|
213
|
+
lines.push('');
|
|
214
|
+
// Deep research follow-up
|
|
215
|
+
lines.push(`**Synthesize findings with deep research:**`);
|
|
216
|
+
lines.push('```');
|
|
217
|
+
lines.push(`deep_research(questions=[{question: "Based on web search results, what are the key findings, best practices, and recommendations for [topic]?"}])`);
|
|
218
|
+
lines.push('```');
|
|
219
|
+
lines.push('');
|
|
220
|
+
return lines.join('\n');
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Full aggregation pipeline with fallback thresholds
|
|
224
|
+
* Tries ≥3, falls back to ≥2, then ≥1 if needed
|
|
225
|
+
*/
|
|
226
|
+
export function aggregateAndRank(searches, minConsensusUrls = 5) {
|
|
227
|
+
const urlMap = aggregateResults(searches);
|
|
228
|
+
const totalUniqueUrls = urlMap.size;
|
|
229
|
+
const totalQueries = searches.length;
|
|
230
|
+
// Try thresholds in order: 3, 2, 1
|
|
231
|
+
const thresholds = [3, 2, 1];
|
|
232
|
+
let rankedUrls = [];
|
|
233
|
+
let usedThreshold = 3;
|
|
234
|
+
let thresholdNote;
|
|
235
|
+
for (const threshold of thresholds) {
|
|
236
|
+
const filtered = filterByFrequency(urlMap, threshold);
|
|
237
|
+
rankedUrls = calculateWeightedScores(filtered);
|
|
238
|
+
if (rankedUrls.length >= minConsensusUrls || threshold === 1) {
|
|
239
|
+
usedThreshold = threshold;
|
|
240
|
+
if (threshold < 3) {
|
|
241
|
+
thresholdNote = `Note: Frequency filter lowered to ≥${threshold} due to result diversity.`;
|
|
242
|
+
}
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
rankedUrls,
|
|
248
|
+
totalUniqueUrls,
|
|
249
|
+
totalQueries,
|
|
250
|
+
frequencyThreshold: usedThreshold,
|
|
251
|
+
thresholdNote,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Build URL lookup map for quick consensus checking during result formatting
|
|
256
|
+
*/
|
|
257
|
+
export function buildUrlLookup(rankedUrls) {
|
|
258
|
+
const lookup = new Map();
|
|
259
|
+
for (const url of rankedUrls) {
|
|
260
|
+
const normalized = normalizeUrl(url.url);
|
|
261
|
+
lookup.set(normalized, url);
|
|
262
|
+
// Also store original URL
|
|
263
|
+
lookup.set(url.url.toLowerCase(), url);
|
|
264
|
+
}
|
|
265
|
+
return lookup;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Look up a URL in the ranked results
|
|
269
|
+
*/
|
|
270
|
+
export function lookupUrl(url, lookup) {
|
|
271
|
+
const normalized = normalizeUrl(url);
|
|
272
|
+
return lookup.get(normalized) || lookup.get(url.toLowerCase());
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Aggregate Reddit search results from multiple queries
|
|
276
|
+
*/
|
|
277
|
+
function aggregateRedditResults(searches) {
|
|
278
|
+
const urlMap = new Map();
|
|
279
|
+
for (const [query, results] of searches) {
|
|
280
|
+
for (let i = 0; i < results.length; i++) {
|
|
281
|
+
const result = results[i];
|
|
282
|
+
const position = i + 1;
|
|
283
|
+
const normalizedUrl = normalizeUrl(result.url);
|
|
284
|
+
const existing = urlMap.get(normalizedUrl);
|
|
285
|
+
if (existing) {
|
|
286
|
+
existing.frequency += 1;
|
|
287
|
+
existing.positions.push(position);
|
|
288
|
+
existing.queries.push(query);
|
|
289
|
+
const prevBest = existing.bestPosition;
|
|
290
|
+
existing.bestPosition = Math.min(existing.bestPosition, position);
|
|
291
|
+
existing.totalScore += getCtrWeight(position);
|
|
292
|
+
// Keep best title/snippet (from highest ranking position)
|
|
293
|
+
if (position < prevBest) {
|
|
294
|
+
existing.title = result.title;
|
|
295
|
+
existing.snippet = result.snippet;
|
|
296
|
+
existing.date = result.date;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
urlMap.set(normalizedUrl, {
|
|
301
|
+
url: result.url,
|
|
302
|
+
title: result.title,
|
|
303
|
+
snippet: result.snippet,
|
|
304
|
+
date: result.date,
|
|
305
|
+
frequency: 1,
|
|
306
|
+
positions: [position],
|
|
307
|
+
queries: [query],
|
|
308
|
+
bestPosition: position,
|
|
309
|
+
totalScore: getCtrWeight(position),
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return urlMap;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Filter Reddit URLs by minimum frequency
|
|
318
|
+
*/
|
|
319
|
+
function filterRedditByFrequency(urlMap, minFrequency) {
|
|
320
|
+
const filtered = [];
|
|
321
|
+
for (const url of urlMap.values()) {
|
|
322
|
+
if (url.frequency >= minFrequency) {
|
|
323
|
+
filtered.push(url);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
return filtered;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Calculate weighted scores for Reddit URLs
|
|
330
|
+
*/
|
|
331
|
+
function calculateRedditWeightedScores(urls) {
|
|
332
|
+
if (urls.length === 0)
|
|
333
|
+
return [];
|
|
334
|
+
// Sort by total score descending
|
|
335
|
+
const sorted = [...urls].sort((a, b) => b.totalScore - a.totalScore);
|
|
336
|
+
// Find max score for normalization
|
|
337
|
+
const maxScore = sorted[0].totalScore;
|
|
338
|
+
// Map to ranked URLs with normalized scores
|
|
339
|
+
return sorted.map((url, index) => ({
|
|
340
|
+
url: url.url,
|
|
341
|
+
title: url.title,
|
|
342
|
+
snippet: url.snippet,
|
|
343
|
+
date: url.date,
|
|
344
|
+
rank: index + 1,
|
|
345
|
+
score: maxScore > 0 ? (url.totalScore / maxScore) * 100 : 0,
|
|
346
|
+
frequency: url.frequency,
|
|
347
|
+
positions: url.positions,
|
|
348
|
+
queries: url.queries,
|
|
349
|
+
bestPosition: url.bestPosition,
|
|
350
|
+
isConsensus: url.frequency >= 2, // Lower threshold for Reddit (often fewer results)
|
|
351
|
+
}));
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Full Reddit aggregation pipeline with fallback thresholds
|
|
355
|
+
*/
|
|
356
|
+
export function aggregateAndRankReddit(searches, minConsensusUrls = 3) {
|
|
357
|
+
const urlMap = aggregateRedditResults(searches);
|
|
358
|
+
const totalUniqueUrls = urlMap.size;
|
|
359
|
+
const totalQueries = searches.size;
|
|
360
|
+
// Try thresholds in order: 2, 1 (Reddit often has less overlap than web search)
|
|
361
|
+
const thresholds = [2, 1];
|
|
362
|
+
let rankedUrls = [];
|
|
363
|
+
let usedThreshold = 2;
|
|
364
|
+
let thresholdNote;
|
|
365
|
+
for (const threshold of thresholds) {
|
|
366
|
+
const filtered = filterRedditByFrequency(urlMap, threshold);
|
|
367
|
+
rankedUrls = calculateRedditWeightedScores(filtered);
|
|
368
|
+
if (rankedUrls.length >= minConsensusUrls || threshold === 1) {
|
|
369
|
+
usedThreshold = threshold;
|
|
370
|
+
if (threshold < 2 && totalQueries > 1) {
|
|
371
|
+
thresholdNote = `Note: Frequency filter set to ≥${threshold} due to result diversity across queries.`;
|
|
372
|
+
}
|
|
373
|
+
break;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return {
|
|
377
|
+
rankedUrls,
|
|
378
|
+
totalUniqueUrls,
|
|
379
|
+
totalQueries,
|
|
380
|
+
frequencyThreshold: usedThreshold,
|
|
381
|
+
thresholdNote,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Generate enhanced output for Reddit aggregated results
|
|
386
|
+
* Now includes both aggregated view AND per-query raw results
|
|
387
|
+
*/
|
|
388
|
+
export function generateRedditEnhancedOutput(aggregation, allQueries, rawResults) {
|
|
389
|
+
const { rankedUrls, totalUniqueUrls, frequencyThreshold, thresholdNote } = aggregation;
|
|
390
|
+
const lines = [];
|
|
391
|
+
// Header
|
|
392
|
+
lines.push(`# 🔍 Reddit Search Results (Aggregated from ${allQueries.length} Queries)`);
|
|
393
|
+
lines.push('');
|
|
394
|
+
lines.push(`**Total Unique Posts:** ${totalUniqueUrls} | **Consensus Threshold:** ≥${frequencyThreshold} appearances`);
|
|
395
|
+
lines.push('');
|
|
396
|
+
if (thresholdNote) {
|
|
397
|
+
lines.push(`> ${thresholdNote}`);
|
|
398
|
+
lines.push('');
|
|
399
|
+
}
|
|
400
|
+
// Consensus section (URLs appearing in multiple queries)
|
|
401
|
+
const consensusUrls = rankedUrls.filter(u => u.frequency >= frequencyThreshold && u.frequency > 1);
|
|
402
|
+
if (consensusUrls.length > 0) {
|
|
403
|
+
lines.push('## ⭐ High-Consensus Posts (Multiple Queries)');
|
|
404
|
+
lines.push('');
|
|
405
|
+
lines.push('*These posts appeared across multiple search queries, indicating high relevance:*');
|
|
406
|
+
lines.push('');
|
|
407
|
+
for (const url of consensusUrls) {
|
|
408
|
+
const dateStr = url.date ? ` • 📅 ${url.date}` : '';
|
|
409
|
+
const queriesList = url.queries.map(q => `"${q}"`).join(', ');
|
|
410
|
+
lines.push(`### #${url.rank}: ${url.title}`);
|
|
411
|
+
lines.push(`**Score:** ${url.score.toFixed(1)} | **Found in:** ${url.frequency} queries (${queriesList})${dateStr}`);
|
|
412
|
+
lines.push(`${url.url}`);
|
|
413
|
+
lines.push(`> ${url.snippet}`);
|
|
414
|
+
lines.push('');
|
|
415
|
+
}
|
|
416
|
+
lines.push('---');
|
|
417
|
+
lines.push('');
|
|
418
|
+
}
|
|
419
|
+
// All results ranked by CTR score
|
|
420
|
+
lines.push('## 📊 All Results (CTR-Ranked)');
|
|
421
|
+
lines.push('');
|
|
422
|
+
for (const url of rankedUrls) {
|
|
423
|
+
const dateStr = url.date ? ` • 📅 ${url.date}` : '';
|
|
424
|
+
const consensusMarker = url.frequency > 1 ? ' ⭐' : '';
|
|
425
|
+
lines.push(`**${url.rank}. ${url.title}**${consensusMarker}${dateStr}`);
|
|
426
|
+
lines.push(`${url.url}`);
|
|
427
|
+
lines.push(`> ${url.snippet}`);
|
|
428
|
+
if (url.frequency > 1) {
|
|
429
|
+
lines.push(`_Found in ${url.frequency} queries: ${url.queries.map(q => `"${q}"`).join(', ')}_`);
|
|
430
|
+
}
|
|
431
|
+
lines.push('');
|
|
432
|
+
}
|
|
433
|
+
// Per-Query Raw Results Section (NEW)
|
|
434
|
+
if (rawResults && rawResults.size > 0) {
|
|
435
|
+
lines.push('---');
|
|
436
|
+
lines.push('');
|
|
437
|
+
lines.push('## 📋 Per-Query Raw Results');
|
|
438
|
+
lines.push('');
|
|
439
|
+
lines.push('*Complete results for each individual query before aggregation:*');
|
|
440
|
+
lines.push('');
|
|
441
|
+
for (const [query, results] of rawResults) {
|
|
442
|
+
lines.push(`### 🔎 Query: "${query}"`);
|
|
443
|
+
lines.push(`**Results:** ${results.length} posts`);
|
|
444
|
+
lines.push('');
|
|
445
|
+
if (results.length === 0) {
|
|
446
|
+
lines.push('_No results found for this query._');
|
|
447
|
+
lines.push('');
|
|
448
|
+
continue;
|
|
449
|
+
}
|
|
450
|
+
for (let i = 0; i < results.length; i++) {
|
|
451
|
+
const result = results[i];
|
|
452
|
+
const position = i + 1;
|
|
453
|
+
const dateStr = result.date ? ` • 📅 ${result.date}` : '';
|
|
454
|
+
lines.push(`${position}. **${result.title}**${dateStr}`);
|
|
455
|
+
lines.push(` ${result.url}`);
|
|
456
|
+
lines.push(` > ${result.snippet}`);
|
|
457
|
+
lines.push('');
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
// Metadata
|
|
462
|
+
lines.push('---');
|
|
463
|
+
lines.push('');
|
|
464
|
+
lines.push('### 📈 Search Metadata');
|
|
465
|
+
lines.push('');
|
|
466
|
+
lines.push(`- **Queries:** ${allQueries.map(q => `"${q}"`).join(', ')}`);
|
|
467
|
+
lines.push(`- **Unique Posts Found:** ${totalUniqueUrls}`);
|
|
468
|
+
lines.push(`- **High-Consensus Posts:** ${consensusUrls.length}`);
|
|
469
|
+
lines.push('');
|
|
470
|
+
// Next Steps - actionable follow-up commands
|
|
471
|
+
lines.push('---');
|
|
472
|
+
lines.push('');
|
|
473
|
+
lines.push('### ➡️ Next Steps');
|
|
474
|
+
lines.push('');
|
|
475
|
+
// Generate URL list for get_reddit_post command
|
|
476
|
+
const topUrls = rankedUrls.slice(0, Math.min(10, rankedUrls.length));
|
|
477
|
+
if (topUrls.length >= 2) {
|
|
478
|
+
const urlList = topUrls.map(u => `"${u.url}"`).join(', ');
|
|
479
|
+
lines.push(`**Fetch full posts with comments:**`);
|
|
480
|
+
lines.push('```');
|
|
481
|
+
lines.push(`get_reddit_post(urls=[${urlList}], fetch_comments=true)`);
|
|
482
|
+
lines.push('```');
|
|
483
|
+
lines.push('');
|
|
484
|
+
}
|
|
485
|
+
// Suggest LLM extraction if there are consensus posts
|
|
486
|
+
if (consensusUrls.length > 0) {
|
|
487
|
+
const consensusUrlList = consensusUrls.slice(0, 5).map(u => `"${u.url}"`).join(', ');
|
|
488
|
+
lines.push(`**Extract insights with AI (recommended for consensus posts):**`);
|
|
489
|
+
lines.push('```');
|
|
490
|
+
lines.push(`get_reddit_post(urls=[${consensusUrlList}], fetch_comments=true, use_llm=true, what_to_extract="Extract key recommendations, consensus opinions, and practical advice")`);
|
|
491
|
+
lines.push('```');
|
|
492
|
+
lines.push('');
|
|
493
|
+
}
|
|
494
|
+
// Deep research follow-up
|
|
495
|
+
lines.push(`**Synthesize findings with deep research:**`);
|
|
496
|
+
lines.push('```');
|
|
497
|
+
lines.push(`deep_research(questions=[{question: "Based on these Reddit discussions about [topic], what are the main recommendations, common issues, and best practices?"}])`);
|
|
498
|
+
lines.push('```');
|
|
499
|
+
lines.push('');
|
|
500
|
+
return lines.join('\n');
|
|
501
|
+
}
|
|
502
|
+
//# sourceMappingURL=url-aggregator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-aggregator.js","sourceRoot":"","sources":["../../src/utils/url-aggregator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version Module - Single Source of Truth
|
|
3
|
+
*
|
|
4
|
+
* This module reads the version from package.json at runtime.
|
|
5
|
+
* All version references in the codebase should import from here.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { VERSION, PACKAGE_NAME } from './version.js';
|
|
9
|
+
*
|
|
10
|
+
* The version is automatically synced with package.json - no manual updates needed.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Package version from package.json
|
|
14
|
+
* This is the single source of truth for versioning
|
|
15
|
+
*/
|
|
16
|
+
export declare const VERSION: string;
|
|
17
|
+
/**
|
|
18
|
+
* Package name from package.json
|
|
19
|
+
*/
|
|
20
|
+
export declare const PACKAGE_NAME: string;
|
|
21
|
+
/**
|
|
22
|
+
* Package description from package.json
|
|
23
|
+
*/
|
|
24
|
+
export declare const PACKAGE_DESCRIPTION: string;
|
|
25
|
+
/**
|
|
26
|
+
* Formatted version string for user agents and logging
|
|
27
|
+
* Example: "research-powerpack-mcp/3.2.0"
|
|
28
|
+
*/
|
|
29
|
+
export declare const USER_AGENT_VERSION: string;
|
|
30
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAkCH;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,MAA4B,CAAC;AAEnD;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAyB,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAgC,CAAC;AAEnE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAqC,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version Module - Single Source of Truth
|
|
3
|
+
*
|
|
4
|
+
* This module reads the version from package.json at runtime.
|
|
5
|
+
* All version references in the codebase should import from here.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { VERSION, PACKAGE_NAME } from './version.js';
|
|
9
|
+
*
|
|
10
|
+
* The version is automatically synced with package.json - no manual updates needed.
|
|
11
|
+
*/
|
|
12
|
+
import { createRequire } from 'module';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
import { dirname, join } from 'path';
|
|
15
|
+
// Create a require function for ESM to import JSON
|
|
16
|
+
const require = createRequire(import.meta.url);
|
|
17
|
+
// Get the directory of this file to find package.json
|
|
18
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
+
const __dirname = dirname(__filename);
|
|
20
|
+
// Load package.json - works from both src/ and dist/
|
|
21
|
+
let packageJson;
|
|
22
|
+
try {
|
|
23
|
+
// Try loading from project root (when running from dist/)
|
|
24
|
+
packageJson = require(join(__dirname, '..', 'package.json'));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
try {
|
|
28
|
+
// Try loading from two levels up (when running from src/)
|
|
29
|
+
packageJson = require(join(__dirname, '..', '..', 'package.json'));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Fallback if package.json can't be found (should never happen)
|
|
33
|
+
console.error('[Version] Warning: Could not load package.json, using fallback version');
|
|
34
|
+
packageJson = {
|
|
35
|
+
version: '0.0.0-unknown',
|
|
36
|
+
name: 'research-powerpack-mcp',
|
|
37
|
+
description: 'Research Powerpack MCP Server',
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Package version from package.json
|
|
43
|
+
* This is the single source of truth for versioning
|
|
44
|
+
*/
|
|
45
|
+
export const VERSION = packageJson.version;
|
|
46
|
+
/**
|
|
47
|
+
* Package name from package.json
|
|
48
|
+
*/
|
|
49
|
+
export const PACKAGE_NAME = packageJson.name;
|
|
50
|
+
/**
|
|
51
|
+
* Package description from package.json
|
|
52
|
+
*/
|
|
53
|
+
export const PACKAGE_DESCRIPTION = packageJson.description;
|
|
54
|
+
/**
|
|
55
|
+
* Formatted version string for user agents and logging
|
|
56
|
+
* Example: "research-powerpack-mcp/3.2.0"
|
|
57
|
+
*/
|
|
58
|
+
export const USER_AGENT_VERSION = `${PACKAGE_NAME}/${VERSION}`;
|
|
59
|
+
// VERSION_INFO removed - unused, individual exports sufficient
|
|
60
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,mDAAmD;AACnD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,sDAAsD;AACtD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,qDAAqD;AACrD,IAAI,WAAmE,CAAC;AAExE,IAAI,CAAC;IACH,0DAA0D;IAC1D,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;AAC/D,CAAC;AAAC,MAAM,CAAC;IACP,IAAI,CAAC;QACH,0DAA0D;QAC1D,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;QAChE,OAAO,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAC;QACxF,WAAW,GAAG;YACZ,OAAO,EAAE,eAAe;YACxB,IAAI,EAAE,wBAAwB;YAC9B,WAAW,EAAE,+BAA+B;SAC7C,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAW,WAAW,CAAC,OAAO,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAW,WAAW,CAAC,IAAI,CAAC;AAErD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAW,WAAW,CAAC,WAAW,CAAC;AAEnE;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAW,GAAG,YAAY,IAAI,OAAO,EAAE,CAAC;AAEvE,+DAA+D"}
|
package/dist/worker.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Workers entry point for Research Powerpack MCP
|
|
3
|
+
* Uses the `agents` package McpAgent pattern for Durable Object-backed MCP sessions
|
|
4
|
+
*/
|
|
5
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
|
+
import { McpAgent } from 'agents/mcp';
|
|
7
|
+
export declare class ResearchPowerpackMCP extends McpAgent {
|
|
8
|
+
server: McpServer;
|
|
9
|
+
init(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
declare const _default: {
|
|
12
|
+
fetch(request: Request, env: unknown, ctx: {
|
|
13
|
+
waitUntil(p: Promise<unknown>): void;
|
|
14
|
+
}): Response | Promise<Response>;
|
|
15
|
+
};
|
|
16
|
+
export default _default;
|
|
17
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAOtC,qBAAa,oBAAqB,SAAQ,QAAQ;IAChD,MAAM,YAGH;IAEG,IAAI;CA8BX;;mBAGgB,OAAO,OAAO,OAAO,OAAO;QAAE,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;KAAE;;AADrF,wBAiBE"}
|