vme-mcp-server
Version:
An intelligent Model Context Protocol (MCP) server that transforms HPE VM Essentials (VME) infrastructure management into natural language conversations. Provision VMs, manage resources, and control your infrastructure through simple English commands with
55 lines (54 loc) • 2.65 kB
JavaScript
import { writeFileSync, existsSync, mkdirSync } from "fs";
import { join } from "path";
// AI Training Data Collection Configuration
const AI_TRAINING_ENABLED = process.env.ENABLE_AI_TRAINING_DATA === 'true';
const AI_TRAINING_FIELDS = (process.env.AI_TRAINING_DATA_FIELDS || 'user_input,parsed_output,success_metrics').split(',');
const AI_TRAINING_RETENTION_DAYS = parseInt(process.env.AI_TRAINING_DATA_RETENTION_DAYS || '30');
// Generate session ID for interaction tracking
export function generateSessionId() {
return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
}
// Privacy-aware interaction logging
export function logInteraction(interaction) {
if (!AI_TRAINING_ENABLED) {
return; // Respect user privacy choice
}
try {
// Ensure logs directory exists
const logsDir = join(process.cwd(), 'ai-training-logs');
if (!existsSync(logsDir)) {
mkdirSync(logsDir, { recursive: true });
}
// Filter fields based on user preferences
const filteredInteraction = {
id: interaction.id || `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
timestamp: new Date().toISOString(),
session_id: interaction.session_id || 'unknown',
tool_name: interaction.tool_name || 'unknown'
};
// Only include fields user has opted into
if (AI_TRAINING_FIELDS.includes('user_input') && interaction.user_input) {
filteredInteraction.user_input = interaction.user_input;
}
if (AI_TRAINING_FIELDS.includes('parsed_output') && interaction.parsed_output) {
filteredInteraction.parsed_output = interaction.parsed_output;
}
if (AI_TRAINING_FIELDS.includes('api_calls') && interaction.api_calls) {
filteredInteraction.api_calls = interaction.api_calls;
}
if (AI_TRAINING_FIELDS.includes('success_metrics') && interaction.success_metrics) {
filteredInteraction.success_metrics = interaction.success_metrics;
}
if (AI_TRAINING_FIELDS.includes('timing') && interaction.timing) {
filteredInteraction.timing = interaction.timing;
}
// Append to daily log file (JSONL format)
const logFile = join(logsDir, `interactions-${new Date().toISOString().split('T')[0]}.jsonl`);
const logEntry = JSON.stringify(filteredInteraction) + '\n';
writeFileSync(logFile, logEntry, { flag: 'a' });
}
catch (error) {
// Fail silently to not disrupt user experience
console.warn('AI training data logging failed:', error);
}
}