env.ts•5.24 kB
// Environment variable configuration for the MCP Omnisearch server
// Search provider API keys
export const TAVILY_API_KEY = process.env.TAVILY_API_KEY;
export const BRAVE_API_KEY = process.env.BRAVE_API_KEY;
export const KAGI_API_KEY = process.env.KAGI_API_KEY;
export const GITHUB_API_KEY = process.env.GITHUB_API_KEY;
export const EXA_API_KEY = process.env.EXA_API_KEY;
// AI provider API keys
export const PERPLEXITY_API_KEY = process.env.PERPLEXITY_API_KEY;
// Content processing API keys
export const JINA_AI_API_KEY = process.env.JINA_AI_API_KEY;
export const FIRECRAWL_API_KEY = process.env.FIRECRAWL_API_KEY;
export const FIRECRAWL_BASE_URL = process.env.FIRECRAWL_BASE_URL;
// Provider configuration
export const config = {
search: {
tavily: {
api_key: TAVILY_API_KEY,
base_url: 'https://api.tavily.com',
timeout: 30000, // 30 seconds
},
brave: {
api_key: BRAVE_API_KEY,
base_url: 'https://api.search.brave.com/res/v1',
timeout: 10000, // 10 seconds
},
kagi: {
api_key: KAGI_API_KEY,
base_url: 'https://kagi.com/api/v0',
timeout: 20000, // 20 seconds
},
github: {
api_key: GITHUB_API_KEY,
base_url: 'https://api.github.com',
timeout: 20000, // 20 seconds
},
exa: {
api_key: EXA_API_KEY,
base_url: 'https://api.exa.ai',
timeout: 30000, // 30 seconds
},
},
ai_response: {
perplexity: {
api_key: PERPLEXITY_API_KEY,
base_url: 'https://api.perplexity.ai',
timeout: 60000, // 60 seconds
},
kagi_fastgpt: {
api_key: KAGI_API_KEY,
base_url: 'https://kagi.com/api/v0/fastgpt',
timeout: 30000, // 30 seconds
},
exa_answer: {
api_key: EXA_API_KEY,
base_url: 'https://api.exa.ai',
timeout: 30000, // 30 seconds
},
},
processing: {
jina_reader: {
api_key: JINA_AI_API_KEY,
base_url: 'https://api.jina.ai/v1/reader',
timeout: 30000, // 30 seconds
},
kagi_summarizer: {
api_key: KAGI_API_KEY,
base_url: 'https://kagi.com/api/v0/summarize',
timeout: 30000, // 30 seconds
},
tavily_extract: {
api_key: TAVILY_API_KEY,
base_url: 'https://api.tavily.com',
timeout: 30000, // 30 seconds
},
firecrawl_scrape: {
api_key: FIRECRAWL_API_KEY,
base_url: FIRECRAWL_BASE_URL
? `${FIRECRAWL_BASE_URL}/v1/scrape`
: 'https://api.firecrawl.dev/v1/scrape',
timeout: 60000, // 60 seconds - web scraping can take longer
},
firecrawl_crawl: {
api_key: FIRECRAWL_API_KEY,
base_url: FIRECRAWL_BASE_URL
? `${FIRECRAWL_BASE_URL}/v1/crawl`
: 'https://api.firecrawl.dev/v1/crawl',
timeout: 120000, // 120 seconds - crawling can take even longer
},
firecrawl_map: {
api_key: FIRECRAWL_API_KEY,
base_url: FIRECRAWL_BASE_URL
? `${FIRECRAWL_BASE_URL}/v1/map`
: 'https://api.firecrawl.dev/v1/map',
timeout: 60000, // 60 seconds
},
firecrawl_extract: {
api_key: FIRECRAWL_API_KEY,
base_url: FIRECRAWL_BASE_URL
? `${FIRECRAWL_BASE_URL}/v1/extract`
: 'https://api.firecrawl.dev/v1/extract',
timeout: 60000, // 60 seconds
},
firecrawl_actions: {
api_key: FIRECRAWL_API_KEY,
base_url: FIRECRAWL_BASE_URL
? `${FIRECRAWL_BASE_URL}/v1/scrape`
: 'https://api.firecrawl.dev/v1/scrape',
timeout: 90000, // 90 seconds - actions can take longer
},
exa_contents: {
api_key: EXA_API_KEY,
base_url: 'https://api.exa.ai',
timeout: 30000, // 30 seconds
},
exa_similar: {
api_key: EXA_API_KEY,
base_url: 'https://api.exa.ai',
timeout: 30000, // 30 seconds
},
},
enhancement: {
kagi_enrichment: {
api_key: KAGI_API_KEY,
base_url: 'https://kagi.com/api/v0/enrich',
timeout: 20000, // 20 seconds
},
jina_grounding: {
api_key: JINA_AI_API_KEY,
base_url: 'https://api.jina.ai/v1/ground',
timeout: 20000, // 20 seconds
},
},
};
// Validate required environment variables
export const validate_config = () => {
const missing_keys: string[] = [];
const available_keys: string[] = [];
// Check search provider keys
if (!TAVILY_API_KEY) missing_keys.push('TAVILY_API_KEY');
else available_keys.push('TAVILY_API_KEY');
if (!BRAVE_API_KEY) missing_keys.push('BRAVE_API_KEY');
else available_keys.push('BRAVE_API_KEY');
if (!KAGI_API_KEY) missing_keys.push('KAGI_API_KEY');
else available_keys.push('KAGI_API_KEY');
if (!GITHUB_API_KEY) missing_keys.push('GITHUB_API_KEY');
else available_keys.push('GITHUB_API_KEY');
if (!PERPLEXITY_API_KEY) missing_keys.push('PERPLEXITY_API_KEY');
else available_keys.push('PERPLEXITY_API_KEY');
if (!JINA_AI_API_KEY) missing_keys.push('JINA_AI_API_KEY');
else available_keys.push('JINA_AI_API_KEY');
if (!FIRECRAWL_API_KEY) missing_keys.push('FIRECRAWL_API_KEY');
else available_keys.push('FIRECRAWL_API_KEY');
if (!EXA_API_KEY) missing_keys.push('EXA_API_KEY');
else available_keys.push('EXA_API_KEY');
// Log available keys
if (available_keys.length > 0) {
console.error(`Found API keys for: ${available_keys.join(', ')}`);
} else {
console.error(
'Warning: No API keys found. No providers will be available.',
);
}
// Log missing keys as informational
if (missing_keys.length > 0) {
console.warn(
`Missing API keys for: ${missing_keys.join(
', ',
)}. Some providers will not be available.`,
);
}
};