mcp-quiz-server
Version:
🧠AI-Powered Quiz Management via Model Context Protocol (MCP) - Create, manage, and take quizzes directly from VS Code, Claude, and other AI agents.
109 lines (108 loc) • 3.07 kB
JavaScript
;
/**
* @fileoverview MCP Metrics Tracker - Performance Monitoring
* @version 1.0.0
* @since 2025-08-03
* @module MetricsTracker
* @description Tracks MCP handler performance and analytics
* @contributors Claude Code Agent
* @requirements REQ_MONITORING_001 (Performance Tracking)
* @testCoverage Unit tests for metrics collection
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.MetricsTracker = void 0;
/**
* Performance metrics tracker for MCP handlers
*/
class MetricsTracker {
constructor() {
this.analyticsHistory = [];
this.metrics = {
requestCount: 0,
errorCount: 0,
averageResponseTime: 0,
toolCallCount: {},
resourceAccessCount: {},
};
}
/**
* Record a successful request
*/
recordRequest(method, executionTime) {
this.metrics.requestCount++;
this.updateAverageResponseTime(executionTime);
// Track method-specific metrics
if (method.startsWith('tools/')) {
const toolName = method.replace('tools/call', '');
this.metrics.toolCallCount[toolName] = (this.metrics.toolCallCount[toolName] || 0) + 1;
}
}
/**
* Record an error
*/
recordError() {
this.metrics.errorCount++;
}
/**
* Record analytics data
*/
recordAnalytics(sessionId, request, executionTime, success, errorCode) {
const analytics = {
sessionId,
timestamp: new Date(),
method: request.method,
executionTime,
success,
errorCode,
metadata: {
requestSize: JSON.stringify(request).length,
},
};
this.analyticsHistory.push(analytics);
// Keep only last 100 analytics entries to prevent memory bloat
if (this.analyticsHistory.length > 100) {
this.analyticsHistory = this.analyticsHistory.slice(-100);
}
}
/**
* Update average response time
*/
updateAverageResponseTime(newTime) {
const totalRequests = this.metrics.requestCount;
const currentAverage = this.metrics.averageResponseTime;
this.metrics.averageResponseTime =
(currentAverage * (totalRequests - 1) + newTime) / totalRequests;
}
/**
* Get current metrics
*/
getMetrics() {
return { ...this.metrics };
}
/**
* Get analytics history
*/
getAnalytics() {
return [...this.analyticsHistory];
}
/**
* Generate session ID
*/
generateSessionId() {
return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
}
/**
* Reset metrics
*/
reset() {
this.metrics = {
requestCount: 0,
errorCount: 0,
averageResponseTime: 0,
toolCallCount: {},
resourceAccessCount: {},
};
this.analyticsHistory = [];
}
}
exports.MetricsTracker = MetricsTracker;