UNPKG

deepsource-mcp-server

Version:
109 lines 3.77 kB
/** * @fileoverview Configuration management for DeepSource MCP Server * @packageDocumentation */ import { createLogger } from '../utils/logging/logger.js'; import { MCPErrorFactory } from '../utils/error-handling/index.js'; const logger = createLogger('DeepSourceMCP:Config'); /** * Default configuration values */ const defaultConfig = { apiBaseUrl: 'https://api.deepsource.io/graphql/', requestTimeout: 30000, logLevel: 'DEBUG', }; /** * Validates the configuration * @throws MCPError if configuration is invalid */ function validateConfig(config) { if (!config.apiKey) { throw MCPErrorFactory.configuration('DeepSource API key is required but not configured', { environmentVariable: 'DEEPSOURCE_API_KEY', documentation: 'Please set the DEEPSOURCE_API_KEY environment variable with your DeepSource API key', }); } // Validate timeout is a positive number if (config.requestTimeout && (typeof config.requestTimeout !== 'number' || config.requestTimeout <= 0)) { throw MCPErrorFactory.configuration('Request timeout must be a positive number', { provided: config.requestTimeout, environmentVariable: 'DEEPSOURCE_REQUEST_TIMEOUT', }); } return config; } /** * Loads configuration from environment variables */ function loadConfigFromEnv() { const config = {}; if (process.env.DEEPSOURCE_API_KEY) { config.apiKey = process.env.DEEPSOURCE_API_KEY; } if (process.env.DEEPSOURCE_API_BASE_URL) { config.apiBaseUrl = process.env.DEEPSOURCE_API_BASE_URL; } if (process.env.DEEPSOURCE_REQUEST_TIMEOUT) { config.requestTimeout = parseInt(process.env.DEEPSOURCE_REQUEST_TIMEOUT, 10); } if (process.env.LOG_FILE) { config.logFile = process.env.LOG_FILE; } if (process.env.LOG_LEVEL) { config.logLevel = process.env.LOG_LEVEL; } return config; } /** * Gets the current configuration * @returns The validated configuration * @throws MCPError if configuration is invalid */ export function getConfig() { const envConfig = loadConfigFromEnv(); // Merge with defaults const mergedConfig = { ...defaultConfig, ...Object.fromEntries(Object.entries(envConfig).filter(([, value]) => value !== undefined)), }; logger.debug('Loading configuration', { hasApiKey: Boolean(mergedConfig.apiKey), apiBaseUrl: mergedConfig.apiBaseUrl, requestTimeout: mergedConfig.requestTimeout, logLevel: mergedConfig.logLevel, }); return validateConfig(mergedConfig); } /** * Checks if the API key is configured * @returns True if API key is set */ export function hasApiKey() { return Boolean(process.env.DEEPSOURCE_API_KEY); } /** * Gets the API key from configuration * @returns The API key * @throws MCPError if API key is not set */ export function getApiKey() { logger.debug('getApiKey() called', { hasEnvVar: Boolean(process.env.DEEPSOURCE_API_KEY), envVarLength: process.env.DEEPSOURCE_API_KEY?.length, keyPrefix: process.env.DEEPSOURCE_API_KEY?.substring(0, 8), }); const config = getConfig(); logger.debug('API key retrieved from config', { hasApiKey: Boolean(config.apiKey), apiKeyLength: config.apiKey?.length, keyPrefix: config.apiKey?.substring(0, 8), }); return config.apiKey; } // Re-export feature flags export { getFeatureFlags, isFeatureEnabled, getEnabledFeatures, } from './features.js'; // Re-export default configurations export { DEFAULT_SERVER_CONFIG, DEFAULT_API_CONFIG, DEFAULT_DISCOVERY_CONFIG, getEnvironmentConfig, ToolCategory, ToolTag, } from './default.js'; //# sourceMappingURL=index.js.map