deepsource-mcp-server
Version:
Model Context Protocol server for DeepSource
111 lines (96 loc) • 2.81 kB
text/typescript
/**
* @fileoverview Configuration management for DeepSource MCP Server
* @packageDocumentation
*/
import { createLogger } from '../utils/logging/logger.js';
const logger = createLogger('DeepSourceMCP:Config');
/**
* Configuration interface for the DeepSource MCP Server
*/
export interface DeepSourceConfig {
/** DeepSource API key for authentication */
apiKey: string;
/** Base URL for DeepSource API */
apiBaseUrl: string;
/** Request timeout in milliseconds */
requestTimeout: number;
/** Log file path (optional) */
logFile?: string;
/** Log level */
logLevel: string;
}
/**
* Default configuration values
*/
const defaultConfig: Partial<DeepSourceConfig> = {
apiBaseUrl: 'https://api.deepsource.io/graphql/',
requestTimeout: 30000,
logLevel: 'DEBUG',
};
/**
* Validates the configuration
* @throws Error if configuration is invalid
*/
function validateConfig(config: Partial<DeepSourceConfig>): DeepSourceConfig {
if (!config.apiKey) {
throw new Error('DEEPSOURCE_API_KEY environment variable is not set');
}
// Validate timeout is a positive number
if (
config.requestTimeout &&
(typeof config.requestTimeout !== 'number' || config.requestTimeout <= 0)
) {
throw new Error('Request timeout must be a positive number');
}
return config as DeepSourceConfig;
}
/**
* Loads configuration from environment variables
*/
function loadConfigFromEnv(): Partial<DeepSourceConfig> {
return {
apiKey: process.env.DEEPSOURCE_API_KEY,
apiBaseUrl: process.env.DEEPSOURCE_API_BASE_URL,
requestTimeout: process.env.DEEPSOURCE_REQUEST_TIMEOUT
? parseInt(process.env.DEEPSOURCE_REQUEST_TIMEOUT, 10)
: undefined,
logFile: process.env.LOG_FILE,
logLevel: process.env.LOG_LEVEL,
};
}
/**
* Gets the current configuration
* @returns The validated configuration
* @throws Error if configuration is invalid
*/
export function getConfig(): DeepSourceConfig {
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(): boolean {
return Boolean(process.env.DEEPSOURCE_API_KEY);
}
/**
* Gets the API key from configuration
* @returns The API key
* @throws Error if API key is not set
*/
export function getApiKey(): string {
const config = getConfig();
return config.apiKey;
}