research-powerpack-mcp 3.6.4 → 3.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "research-powerpack-mcp",
3
- "version": "3.6.4",
3
+ "version": "3.6.5",
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",
@@ -1,75 +0,0 @@
1
- /**
2
- * Centralized Environment Variable Validation
3
- * Uses Zod for type-safe parsing with helpful error messages
4
- */
5
- import { z } from 'zod';
6
- declare const envSchema: z.ZodObject<{
7
- SCRAPEDO_API_KEY: z.ZodOptional<z.ZodString>;
8
- SERPER_API_KEY: z.ZodOptional<z.ZodString>;
9
- REDDIT_CLIENT_ID: z.ZodOptional<z.ZodString>;
10
- REDDIT_CLIENT_SECRET: z.ZodOptional<z.ZodString>;
11
- OPENROUTER_API_KEY: z.ZodOptional<z.ZodString>;
12
- OPENROUTER_BASE_URL: z.ZodDefault<z.ZodOptional<z.ZodString>>;
13
- RESEARCH_MODEL: z.ZodDefault<z.ZodOptional<z.ZodString>>;
14
- RESEARCH_FALLBACK_MODEL: z.ZodDefault<z.ZodOptional<z.ZodString>>;
15
- DEFAULT_REASONING_EFFORT: z.ZodDefault<z.ZodOptional<z.ZodEnum<["low", "medium", "high"]>>>;
16
- DEFAULT_MAX_URLS: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
17
- API_TIMEOUT_MS: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
18
- LLM_EXTRACTION_MODEL: z.ZodDefault<z.ZodOptional<z.ZodString>>;
19
- LLM_ENABLE_REASONING: z.ZodDefault<z.ZodOptional<z.ZodEffects<z.ZodString, boolean, string>>>;
20
- }, "strip", z.ZodTypeAny, {
21
- OPENROUTER_BASE_URL: string;
22
- RESEARCH_MODEL: string;
23
- RESEARCH_FALLBACK_MODEL: string;
24
- API_TIMEOUT_MS: number;
25
- DEFAULT_REASONING_EFFORT: "low" | "medium" | "high";
26
- DEFAULT_MAX_URLS: number;
27
- LLM_EXTRACTION_MODEL: string;
28
- LLM_ENABLE_REASONING: boolean;
29
- SCRAPEDO_API_KEY?: string | undefined;
30
- SERPER_API_KEY?: string | undefined;
31
- REDDIT_CLIENT_ID?: string | undefined;
32
- REDDIT_CLIENT_SECRET?: string | undefined;
33
- OPENROUTER_API_KEY?: string | undefined;
34
- }, {
35
- SCRAPEDO_API_KEY?: string | undefined;
36
- SERPER_API_KEY?: string | undefined;
37
- REDDIT_CLIENT_ID?: string | undefined;
38
- REDDIT_CLIENT_SECRET?: string | undefined;
39
- OPENROUTER_BASE_URL?: string | undefined;
40
- RESEARCH_MODEL?: string | undefined;
41
- RESEARCH_FALLBACK_MODEL?: string | undefined;
42
- OPENROUTER_API_KEY?: string | undefined;
43
- API_TIMEOUT_MS?: number | undefined;
44
- DEFAULT_REASONING_EFFORT?: "low" | "medium" | "high" | undefined;
45
- DEFAULT_MAX_URLS?: number | undefined;
46
- LLM_EXTRACTION_MODEL?: string | undefined;
47
- LLM_ENABLE_REASONING?: string | undefined;
48
- }>;
49
- export type EnvConfig = z.infer<typeof envSchema>;
50
- /**
51
- * Parse and validate environment variables
52
- * Returns cached result on subsequent calls
53
- */
54
- export declare function getEnv(): EnvConfig;
55
- /**
56
- * Clear cached environment (useful for testing)
57
- */
58
- export declare function clearEnvCache(): void;
59
- export interface Capabilities {
60
- reddit: boolean;
61
- search: boolean;
62
- scraping: boolean;
63
- deepResearch: boolean;
64
- llmExtraction: boolean;
65
- }
66
- /**
67
- * Get available capabilities based on configured API keys
68
- */
69
- export declare function getCapabilitiesFromEnv(): Capabilities;
70
- /**
71
- * Get user-friendly message for missing capability
72
- */
73
- export declare function getMissingCapabilityMessage(capability: keyof Capabilities): string;
74
- export {};
75
- //# sourceMappingURL=env.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBb,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAQlD;;;GAGG;AACH,wBAAgB,MAAM,IAAI,SAAS,CAelC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAMD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,YAAY,CASrD;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,YAAY,GAAG,MAAM,CASlF"}
@@ -1,87 +0,0 @@
1
- /**
2
- * Centralized Environment Variable Validation
3
- * Uses Zod for type-safe parsing with helpful error messages
4
- */
5
- import { z } from 'zod';
6
- // ============================================================================
7
- // Environment Schema
8
- // ============================================================================
9
- const envSchema = z.object({
10
- // Scraper API (required for scrape_links)
11
- SCRAPEDO_API_KEY: z.string().optional(),
12
- // Search API (required for web_search and search_reddit)
13
- SERPER_API_KEY: z.string().optional(),
14
- // Reddit API (required for get_reddit_post)
15
- REDDIT_CLIENT_ID: z.string().optional(),
16
- REDDIT_CLIENT_SECRET: z.string().optional(),
17
- // OpenRouter API (required for deep_research and LLM extraction)
18
- OPENROUTER_API_KEY: z.string().optional(),
19
- OPENROUTER_BASE_URL: z.string().url().optional().default('https://openrouter.ai/api/v1'),
20
- // Research configuration
21
- RESEARCH_MODEL: z.string().optional().default('x-ai/grok-4-fast'),
22
- RESEARCH_FALLBACK_MODEL: z.string().optional().default('google/gemini-2.5-flash'),
23
- DEFAULT_REASONING_EFFORT: z.enum(['low', 'medium', 'high']).optional().default('high'),
24
- DEFAULT_MAX_URLS: z.coerce.number().min(10).max(200).optional().default(100),
25
- API_TIMEOUT_MS: z.coerce.number().min(1000).max(3600000).optional().default(1800000),
26
- // LLM extraction configuration
27
- LLM_EXTRACTION_MODEL: z.string().optional().default('openai/gpt-oss-120b:nitro'),
28
- LLM_ENABLE_REASONING: z.string().transform(v => v !== 'false').optional().default('true'),
29
- });
30
- // ============================================================================
31
- // Parse and Validate Environment
32
- // ============================================================================
33
- let cachedEnv = null;
34
- /**
35
- * Parse and validate environment variables
36
- * Returns cached result on subsequent calls
37
- */
38
- export function getEnv() {
39
- if (cachedEnv)
40
- return cachedEnv;
41
- try {
42
- cachedEnv = envSchema.parse(process.env);
43
- return cachedEnv;
44
- }
45
- catch (error) {
46
- if (error instanceof z.ZodError) {
47
- const issues = error.issues.map(i => ` - ${i.path.join('.')}: ${i.message}`).join('\n');
48
- console.error(`[Config] Environment validation failed:\n${issues}`);
49
- }
50
- // Return defaults on error to avoid crashing
51
- cachedEnv = envSchema.parse({});
52
- return cachedEnv;
53
- }
54
- }
55
- /**
56
- * Clear cached environment (useful for testing)
57
- */
58
- export function clearEnvCache() {
59
- cachedEnv = null;
60
- }
61
- /**
62
- * Get available capabilities based on configured API keys
63
- */
64
- export function getCapabilitiesFromEnv() {
65
- const env = getEnv();
66
- return {
67
- reddit: !!(env.REDDIT_CLIENT_ID && env.REDDIT_CLIENT_SECRET),
68
- search: !!env.SERPER_API_KEY,
69
- scraping: !!env.SCRAPEDO_API_KEY,
70
- deepResearch: !!env.OPENROUTER_API_KEY,
71
- llmExtraction: !!env.OPENROUTER_API_KEY,
72
- };
73
- }
74
- /**
75
- * Get user-friendly message for missing capability
76
- */
77
- export function getMissingCapabilityMessage(capability) {
78
- const messages = {
79
- reddit: 'āŒ **Reddit tools unavailable.** Set `REDDIT_CLIENT_ID` and `REDDIT_CLIENT_SECRET` to enable.\n\nšŸ‘‰ Create a Reddit app at: https://www.reddit.com/prefs/apps (select "script" type)',
80
- search: 'āŒ **Search unavailable.** Set `SERPER_API_KEY` to enable web search and Reddit search.\n\nšŸ‘‰ Get your free API key at: https://serper.dev (2,500 free queries)',
81
- scraping: 'āŒ **Web scraping unavailable.** Set `SCRAPEDO_API_KEY` to enable URL content extraction.\n\nšŸ‘‰ Sign up at: https://scrape.do (1,000 free credits)',
82
- deepResearch: 'āŒ **Deep research unavailable.** Set `OPENROUTER_API_KEY` to enable AI-powered research.\n\nšŸ‘‰ Get your API key at: https://openrouter.ai/keys',
83
- llmExtraction: 'āš ļø **AI extraction disabled.** The `use_llm` and `what_to_extract` features require `OPENROUTER_API_KEY`.\n\nScraping will work but without intelligent content filtering.',
84
- };
85
- return messages[capability];
86
- }
87
- //# sourceMappingURL=env.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
File without changes
@@ -1,8 +0,0 @@
1
- /**
2
- * MCP SDK structured logging wrapper
3
- * Sends log messages to MCP clients via server.sendLoggingMessage()
4
- */
5
- import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
- export declare function initLogger(server: Server): void;
7
- export declare function mcpLog(level: 'debug' | 'info' | 'warning' | 'error', message: string, logger?: string): void;
8
- //# sourceMappingURL=mcp-logger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-logger.d.ts","sourceRoot":"","sources":["../../src/utils/mcp-logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAIxE,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAG5G"}
@@ -1,14 +0,0 @@
1
- /**
2
- * MCP SDK structured logging wrapper
3
- * Sends log messages to MCP clients via server.sendLoggingMessage()
4
- */
5
- let serverRef = null;
6
- export function initLogger(server) {
7
- serverRef = server;
8
- }
9
- export function mcpLog(level, message, logger) {
10
- if (!serverRef)
11
- return;
12
- serverRef.sendLoggingMessage({ level, data: message, logger: logger ?? 'research-powerpack' }).catch(() => { });
13
- }
14
- //# sourceMappingURL=mcp-logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-logger.js","sourceRoot":"","sources":["../../src/utils/mcp-logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,IAAI,SAAS,GAAkB,IAAI,CAAC;AAEpC,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,SAAS,GAAG,MAAM,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAA6C,EAAE,OAAe,EAAE,MAAe;IACpG,IAAI,CAAC,SAAS;QAAE,OAAO;IACvB,SAAS,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACjH,CAAC"}