@vfarcic/dot-ai
Version:
Universal Kubernetes application deployment agent with CLI and MCP interfaces
148 lines (147 loc) • 6.62 kB
JavaScript
;
/**
* MCP Server Entry Point for DevOps AI Toolkit
*
* This server exposes DevOps AI Toolkit functionality through the Model Context Protocol,
* enabling AI assistants like Claude Code to interact with Kubernetes deployment capabilities.
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const mcp_js_1 = require("../interfaces/mcp.js");
const index_js_1 = require("../core/index.js");
async function main() {
try {
// Validate required environment variables
process.stderr.write('Validating MCP server configuration...\n');
// Check session directory configuration
const sessionDir = process.env.DOT_AI_SESSION_DIR;
if (!sessionDir) {
process.stderr.write('FATAL: DOT_AI_SESSION_DIR environment variable is required\n');
process.stderr.write('Configuration:\n');
process.stderr.write('- Set DOT_AI_SESSION_DIR in .mcp.json env section\n');
process.stderr.write('- Example: "DOT_AI_SESSION_DIR": "/tmp/dot-ai-sessions"\n');
process.stderr.write('- Ensure the directory exists and is writable\n');
process.exit(1);
}
// Validate session directory exists and is writable
try {
const fs = await Promise.resolve().then(() => __importStar(require('fs')));
const path = await Promise.resolve().then(() => __importStar(require('path')));
// Check if directory exists
if (!fs.existsSync(sessionDir)) {
process.stderr.write(`FATAL: Session directory does not exist: ${sessionDir}\n`);
process.stderr.write('Solution: Create the directory or update DOT_AI_SESSION_DIR\n');
process.exit(1);
}
// Check if it's actually a directory
const stat = fs.statSync(sessionDir);
if (!stat.isDirectory()) {
process.stderr.write(`FATAL: Session directory path is not a directory: ${sessionDir}\n`);
process.stderr.write('Solution: Use a valid directory path in DOT_AI_SESSION_DIR\n');
process.exit(1);
}
// Test write permissions
const testFile = path.join(sessionDir, '.mcp-test-write');
try {
fs.writeFileSync(testFile, 'test');
fs.unlinkSync(testFile);
process.stderr.write(`Session directory validated: ${sessionDir}\n`);
}
catch (writeError) {
process.stderr.write(`FATAL: Session directory is not writable: ${sessionDir}\n`);
process.stderr.write('Solution: Fix directory permissions or use a different directory\n');
process.exit(1);
}
}
catch (error) {
process.stderr.write(`FATAL: Session directory validation failed: ${error}\n`);
process.exit(1);
}
// Initialize DotAI - it will read KUBECONFIG and ANTHROPIC_API_KEY from environment
const dotAI = new index_js_1.DotAI();
// Initialize without cluster connection (lazy connection)
process.stderr.write('Initializing DevOps AI Toolkit...\n');
try {
await dotAI.initializeWithoutCluster();
process.stderr.write('DevOps AI Toolkit initialized successfully\n');
process.stderr.write('Cluster connectivity will be checked when needed by individual tools\n');
}
catch (initError) {
process.stderr.write(`FATAL: Failed to initialize DevOps AI Toolkit: ${initError}\n`);
process.exit(1);
}
// Create and configure MCP server
const mcpServer = new mcp_js_1.MCPServer(dotAI, {
name: 'dot-ai',
version: '0.1.0',
description: 'Universal Kubernetes application deployment agent with AI-powered orchestration',
author: 'Viktor Farcic'
});
// Start the MCP server
process.stderr.write('Starting DevOps AI Toolkit MCP server...\n');
await mcpServer.start();
process.stderr.write('DevOps AI Toolkit MCP server started successfully\n');
// Handle graceful shutdown
process.on('SIGINT', async () => {
process.stderr.write('Shutting down DevOps AI Toolkit MCP server...\n');
await mcpServer.stop();
process.exit(0);
});
process.on('SIGTERM', async () => {
process.stderr.write('Shutting down DevOps AI Toolkit MCP server...\n');
await mcpServer.stop();
process.exit(0);
});
}
catch (error) {
process.stderr.write(`Failed to start DevOps AI Toolkit MCP server: ${error}\n`);
process.exit(1);
}
}
// Handle uncaught exceptions
process.on('uncaughtException', (error) => {
process.stderr.write(`Uncaught exception in MCP server: ${error}\n`);
process.exit(1);
});
process.on('unhandledRejection', (reason) => {
process.stderr.write(`Unhandled rejection in MCP server: ${reason}\n`);
process.exit(1);
});
// Start the server
main().catch((error) => {
process.stderr.write(`Fatal error starting MCP server: ${error}\n`);
process.exit(1);
});