research-powerpack-mcp 3.4.7 → 3.5.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.
Files changed (45) hide show
  1. package/README.md +63 -655
  2. package/dist/clients/reddit.d.ts.map +1 -1
  3. package/dist/clients/reddit.js +23 -35
  4. package/dist/clients/reddit.js.map +1 -1
  5. package/dist/clients/scraper.d.ts +1 -6
  6. package/dist/clients/scraper.d.ts.map +1 -1
  7. package/dist/clients/scraper.js +33 -69
  8. package/dist/clients/scraper.js.map +1 -1
  9. package/dist/config/env.d.ts +75 -0
  10. package/dist/config/env.d.ts.map +1 -0
  11. package/dist/config/env.js +87 -0
  12. package/dist/config/env.js.map +1 -0
  13. package/dist/config/yaml/tools-enhanced.yaml +0 -0
  14. package/dist/index.js +85 -25
  15. package/dist/index.js.map +1 -1
  16. package/dist/services/llm-processor.js +0 -25
  17. package/dist/services/llm-processor.js.map +1 -1
  18. package/dist/tools/reddit.d.ts.map +1 -1
  19. package/dist/tools/reddit.js +77 -29
  20. package/dist/tools/reddit.js.map +1 -1
  21. package/dist/tools/research.d.ts +2 -6
  22. package/dist/tools/research.d.ts.map +1 -1
  23. package/dist/tools/research.js +60 -47
  24. package/dist/tools/research.js.map +1 -1
  25. package/dist/tools/scrape.d.ts +1 -5
  26. package/dist/tools/scrape.d.ts.map +1 -1
  27. package/dist/tools/scrape.js +107 -64
  28. package/dist/tools/scrape.js.map +1 -1
  29. package/dist/tools/search.d.ts +1 -5
  30. package/dist/tools/search.d.ts.map +1 -1
  31. package/dist/tools/search.js +26 -16
  32. package/dist/tools/search.js.map +1 -1
  33. package/dist/tools/utils.d.ts +20 -59
  34. package/dist/tools/utils.d.ts.map +1 -1
  35. package/dist/tools/utils.js +25 -61
  36. package/dist/tools/utils.js.map +1 -1
  37. package/dist/utils/logger.d.ts +36 -0
  38. package/dist/utils/logger.d.ts.map +1 -0
  39. package/dist/utils/logger.js +40 -0
  40. package/dist/utils/logger.js.map +1 -0
  41. package/dist/utils/response.d.ts +101 -0
  42. package/dist/utils/response.d.ts.map +1 -0
  43. package/dist/utils/response.js +183 -0
  44. package/dist/utils/response.js.map +1 -0
  45. package/package.json +8 -2
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Standardized Response Formatting for MCP Tools
3
+ * Implements the 70/20/10 pattern for agent-optimized responses
4
+ *
5
+ * 70% Summary - Key insights, status, metrics
6
+ * 20% Data - Structured results
7
+ * 10% Next Steps - Actionable follow-ups
8
+ */
9
+ // ============================================================================
10
+ // Success Response Formatting
11
+ // ============================================================================
12
+ /**
13
+ * Format a successful tool response using the 70/20/10 pattern
14
+ *
15
+ * @example
16
+ * formatSuccess({
17
+ * title: 'Web Search Results',
18
+ * summary: '**Found 45 unique URLs** across 5 queries\n• 12 consensus results (appeared 3+ times)\n• Top domains: github.com, stackoverflow.com',
19
+ * data: '## Top Results\n1. [Title](url) - snippet\n2. ...',
20
+ * nextSteps: ['Scrape top URLs: scrape_links({urls: [...]})', 'Deep dive: deep_research({...})']
21
+ * })
22
+ */
23
+ export function formatSuccess(options) {
24
+ const sections = [];
25
+ // Title
26
+ sections.push(`# ✅ ${options.title}`);
27
+ // Summary (70%)
28
+ sections.push('');
29
+ sections.push(options.summary);
30
+ // Data (20%)
31
+ if (options.data) {
32
+ sections.push('');
33
+ sections.push('---');
34
+ sections.push('');
35
+ sections.push(options.data);
36
+ }
37
+ // Metadata
38
+ if (options.metadata && Object.keys(options.metadata).length > 0) {
39
+ sections.push('');
40
+ sections.push('---');
41
+ sections.push('');
42
+ sections.push('**Metadata:**');
43
+ for (const [key, value] of Object.entries(options.metadata)) {
44
+ sections.push(`- ${key}: ${value}`);
45
+ }
46
+ }
47
+ // Next Steps (10%)
48
+ if (options.nextSteps && options.nextSteps.length > 0) {
49
+ sections.push('');
50
+ sections.push('---');
51
+ sections.push('');
52
+ sections.push('**→ Next Steps:**');
53
+ for (const step of options.nextSteps) {
54
+ sections.push(`- ${step}`);
55
+ }
56
+ }
57
+ return sections.join('\n');
58
+ }
59
+ // ============================================================================
60
+ // Error Response Formatting
61
+ // ============================================================================
62
+ /**
63
+ * Format an error response with recovery guidance
64
+ *
65
+ * @example
66
+ * formatError({
67
+ * code: 'RATE_LIMITED',
68
+ * message: 'API rate limit exceeded',
69
+ * retryable: true,
70
+ * howToFix: ['Wait 60 seconds', 'Reduce batch size'],
71
+ * alternatives: ['Use cached results', 'Try different API']
72
+ * })
73
+ */
74
+ export function formatError(options) {
75
+ const sections = [];
76
+ // Title with tool name if provided
77
+ const titlePrefix = options.toolName ? `${options.toolName}: ` : '';
78
+ sections.push(`# ❌ ${titlePrefix}${options.code}`);
79
+ // Message
80
+ sections.push('');
81
+ sections.push(options.message);
82
+ // Retry hint
83
+ if (options.retryable !== undefined) {
84
+ sections.push('');
85
+ if (options.retryable) {
86
+ sections.push('💡 **This error may be temporary.** Try again in a moment.');
87
+ }
88
+ else {
89
+ sections.push('⚠️ **This error requires manual intervention.**');
90
+ }
91
+ }
92
+ // How to fix
93
+ if (options.howToFix && options.howToFix.length > 0) {
94
+ sections.push('');
95
+ sections.push('**How to Fix:**');
96
+ options.howToFix.forEach((step, i) => {
97
+ sections.push(`${i + 1}. ${step}`);
98
+ });
99
+ }
100
+ // Alternatives
101
+ if (options.alternatives && options.alternatives.length > 0) {
102
+ sections.push('');
103
+ sections.push('**Alternative Actions:**');
104
+ for (const alt of options.alternatives) {
105
+ sections.push(`• ${alt}`);
106
+ }
107
+ }
108
+ return sections.join('\n');
109
+ }
110
+ // ============================================================================
111
+ // Batch Result Formatting
112
+ // ============================================================================
113
+ /**
114
+ * Format batch operation header with status
115
+ */
116
+ export function formatBatchHeader(options) {
117
+ const sections = [];
118
+ // Title with count
119
+ sections.push(`# ${options.title} (${options.totalItems} items)`);
120
+ // Token allocation if provided
121
+ if (options.tokensPerItem && options.totalBudget) {
122
+ sections.push('');
123
+ sections.push(`**Token Allocation:** ${options.tokensPerItem.toLocaleString()} tokens/item (${options.totalItems} items, ${options.totalBudget.toLocaleString()} total budget)`);
124
+ }
125
+ // Status line
126
+ sections.push('');
127
+ let status = `**Status:** ✅ ${options.successful} successful | ❌ ${options.failed} failed`;
128
+ if (options.batches !== undefined) {
129
+ status += ` | 📦 ${options.batches} batch(es)`;
130
+ }
131
+ if (options.extras && options.extras.length > 0) {
132
+ status += ` | ${options.extras.join(' | ')}`;
133
+ }
134
+ sections.push(status);
135
+ return sections.join('\n');
136
+ }
137
+ // ============================================================================
138
+ // Utility Formatters
139
+ // ============================================================================
140
+ /**
141
+ * Format a list of items with optional truncation
142
+ */
143
+ export function formatList(items, options) {
144
+ const maxItems = options?.maxItems ?? items.length;
145
+ const ordered = options?.ordered ?? false;
146
+ const truncated = items.length > maxItems;
147
+ const displayItems = items.slice(0, maxItems);
148
+ const formatted = displayItems.map((item, i) => {
149
+ return ordered ? `${i + 1}. ${item}` : `• ${item}`;
150
+ });
151
+ if (truncated) {
152
+ formatted.push(`... and ${items.length - maxItems} more`);
153
+ }
154
+ return formatted.join('\n');
155
+ }
156
+ /**
157
+ * Format key-value pairs as a compact list
158
+ */
159
+ export function formatKeyValues(data) {
160
+ return Object.entries(data)
161
+ .filter(([, v]) => v !== undefined && v !== null)
162
+ .map(([k, v]) => `• **${k}:** ${v}`)
163
+ .join('\n');
164
+ }
165
+ /**
166
+ * Format execution time
167
+ */
168
+ export function formatDuration(ms) {
169
+ if (ms < 1000)
170
+ return `${ms}ms`;
171
+ if (ms < 60000)
172
+ return `${(ms / 1000).toFixed(1)}s`;
173
+ return `${(ms / 60000).toFixed(1)}m`;
174
+ }
175
+ /**
176
+ * Truncate text with ellipsis
177
+ */
178
+ export function truncateText(text, maxLength) {
179
+ if (text.length <= maxLength)
180
+ return text;
181
+ return text.slice(0, maxLength - 3) + '...';
182
+ }
183
+ //# 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "research-powerpack-mcp",
3
- "version": "3.4.7",
3
+ "version": "3.5.0",
4
4
  "description": "The ultimate research MCP toolkit: Reddit mining, web search with CTR aggregation, AI-powered deep research, and intelligent web scraping - all in one modular package",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -21,10 +21,14 @@
21
21
  "test:scrape-links": "tsx tests/test-scrape-links.ts",
22
22
  "test:deep-research": "tsx tests/test-deep-research.ts",
23
23
  "test:all": "npm run test:web-search && npm run test:reddit-search && npm run test:scrape-links && npm run test:deep-research",
24
- "test:check": "tsx tests/check-setup.ts"
24
+ "test:check": "tsx tests/check-setup.ts",
25
+ "install:claude-desktop": "npx install-mcp research-powerpack-mcp --client claude-desktop",
26
+ "install:cursor": "npx install-mcp research-powerpack-mcp --client cursor"
25
27
  },
26
28
  "keywords": [
27
29
  "mcp",
30
+ "mcp-server",
31
+ "install-mcp",
28
32
  "research",
29
33
  "reddit",
30
34
  "serper",
@@ -48,6 +52,7 @@
48
52
  "dependencies": {
49
53
  "@modelcontextprotocol/sdk": "^1.18.1",
50
54
  "openai": "^4.77.0",
55
+ "p-limit": "^7.2.0",
51
56
  "turndown": "^7.2.2",
52
57
  "yaml": "^2.7.0",
53
58
  "zod": "^3.24.1",
@@ -57,6 +62,7 @@
57
62
  "@types/node": "^22.0.0",
58
63
  "@types/turndown": "^5.0.6",
59
64
  "dotenv": "^17.2.3",
65
+ "install-mcp": "^1.10.2",
60
66
  "tsx": "^4.19.0",
61
67
  "typescript": "^5.6.0"
62
68
  },