#!/usr/bin/env node
/**
* @fileoverview Main entry point for the DeepSource MCP server using ToolRegistry
*
* @deprecated This file is deprecated. Please use src/index.ts instead.
* This file is provided for backward compatibility and will be removed in the next major version.
*
* Migration guide:
* - Import from 'deepsource-mcp-server' or './index.js' instead of './index-registry.js'
* - Use DeepSourceMCPServer.create() instead of manual registry configuration
* - See MIGRATION.md for detailed migration instructions
*/
import process from 'node:process';
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { createLogger } from './utils/logging/logger.js';
import { VERSION } from './version.js';
// import { RepositoryFactory } from './infrastructure/factories/repository.factory.js';
import { ToolRegistry } from './server/tool-registry.js';
import {
adaptQualityMetricsParams,
adaptUpdateMetricThresholdParams,
adaptUpdateMetricSettingParams,
adaptComplianceReportParams,
adaptProjectIssuesParams,
adaptDependencyVulnerabilitiesParams,
adaptProjectRunsParams,
adaptRunParams,
adaptRecentRunIssuesParams,
} from './adapters/handler-adapters.js';
import {
handleProjects,
handleDeepsourceQualityMetrics,
handleDeepsourceUpdateMetricThreshold,
handleDeepsourceUpdateMetricSetting,
handleDeepsourceComplianceReport,
handleDeepsourceProjectIssues,
handleDeepsourceDependencyVulnerabilities,
handleDeepsourceProjectRuns,
handleDeepsourceRun,
handleDeepsourceRecentRunIssues,
} from './handlers/index.js';
import {
projectsToolSchema,
qualityMetricsToolSchema,
updateMetricThresholdToolSchema,
updateMetricSettingToolSchema,
complianceReportToolSchema,
projectIssuesToolSchema,
dependencyVulnerabilitiesToolSchema,
runsToolSchema,
runToolSchema,
recentRunIssuesToolSchema,
} from './server/tool-definitions.js';
// Environment variables are handled by the getApiKey function in config
// Module logger
const logger = createLogger('Main');
// Log deprecation warning
logger.warn(
'DEPRECATED: index-registry.ts is deprecated and will be removed in the next major version. ' +
'Please use index.ts instead. See MIGRATION.md for migration instructions.'
);
if (process.env.NODE_ENV !== 'test') {
// eslint-disable-next-line no-console
console.warn(
'\n⚠️ WARNING: This entry point (index-registry.ts) is deprecated.\n' +
'Please use the main index.ts entry point instead.\n' +
'This file will be removed in the next major version.\n'
);
}
/**
* Validates environment configuration
*/
export function validateEnvironment(): void {
if (!process.env.DEEPSOURCE_API_KEY) {
const errorMsg = 'DEEPSOURCE_API_KEY environment variable is required';
logger.error(errorMsg);
process.exit(1);
}
logger.info('Environment validated', { hasApiKey: true });
}
/**
* Creates and configures the tool registry with all handlers
*/
export function createAndConfigureToolRegistry(server: McpServer): ToolRegistry {
const toolRegistry = new ToolRegistry(server);
// Register project listing tool
toolRegistry.registerTool({
...projectsToolSchema,
handler: async () => {
// No adaptation needed - no parameters
return handleProjects();
},
});
// Register quality metrics tools
toolRegistry.registerTool({
...qualityMetricsToolSchema,
handler: async (params) => {
const adaptedParams = adaptQualityMetricsParams(params);
return handleDeepsourceQualityMetrics(adaptedParams);
},
});
toolRegistry.registerTool({
...updateMetricThresholdToolSchema,
handler: async (params) => {
const adaptedParams = adaptUpdateMetricThresholdParams(params);
return handleDeepsourceUpdateMetricThreshold(adaptedParams);
},
});
toolRegistry.registerTool({
...updateMetricSettingToolSchema,
handler: async (params) => {
const adaptedParams = adaptUpdateMetricSettingParams(params);
return handleDeepsourceUpdateMetricSetting(adaptedParams);
},
});
// Register compliance report tool
toolRegistry.registerTool({
...complianceReportToolSchema,
handler: async (params) => {
const adaptedParams = adaptComplianceReportParams(params);
return handleDeepsourceComplianceReport(adaptedParams);
},
});
// Register issue tools
toolRegistry.registerTool({
...projectIssuesToolSchema,
handler: async (params) => {
const adaptedParams = adaptProjectIssuesParams(params);
return handleDeepsourceProjectIssues(adaptedParams);
},
});
toolRegistry.registerTool({
...dependencyVulnerabilitiesToolSchema,
handler: async (params) => {
const adaptedParams = adaptDependencyVulnerabilitiesParams(params);
return handleDeepsourceDependencyVulnerabilities(adaptedParams);
},
});
// Register run tools
toolRegistry.registerTool({
...runsToolSchema,
handler: async (params) => {
const adaptedParams = adaptProjectRunsParams(params);
return handleDeepsourceProjectRuns(adaptedParams);
},
});
toolRegistry.registerTool({
...runToolSchema,
handler: async (params) => {
const adaptedParams = adaptRunParams(params);
return handleDeepsourceRun(adaptedParams);
},
});
toolRegistry.registerTool({
...recentRunIssuesToolSchema,
handler: async (params) => {
const adaptedParams = adaptRecentRunIssuesParams(params);
return handleDeepsourceRecentRunIssues(adaptedParams);
},
});
logger.info('Tool registry configured', {
toolCount: toolRegistry.getToolNames().length,
tools: toolRegistry.getToolNames(),
});
return toolRegistry;
}
/**
* Main function that starts the MCP server
*/
export async function main() {
logger.info('Starting DeepSource MCP Server (Registry Implementation)', {
version: VERSION,
});
// Validate environment
validateEnvironment();
// Create MCP server
const server = new McpServer({
name: 'deepsource-mcp-server',
version: VERSION,
});
// Create and configure tool registry
createAndConfigureToolRegistry(server);
// Set up transport
const transport = new StdioServerTransport();
logger.info('Transport initialized', { type: 'stdio' });
// Connect server to transport
await server.connect(transport);
logger.info('Server connected to transport');
logger.info('DeepSource MCP Server running (Registry Implementation)');
}
// Handle errors
process.on('uncaughtException', (error) => {
logger.error('Uncaught exception', {
error: error.message,
stack: error.stack,
});
process.exit(1);
});
process.on('unhandledRejection', (reason, promise) => {
logger.error('Unhandled rejection', {
reason,
promise,
});
process.exit(1);
});
// Run the server
main().catch((error) => {
logger.error('Failed to start server', {
error: error.message,
stack: error.stack,
});
process.exit(1);
});