Skip to main content
Glama

AI Agent Template MCP Server

by bswa006
track-performance.tsโ€ข10.8 kB
import { readFileSync, writeFileSync, existsSync } from 'fs'; import { join } from 'path'; interface PerformanceMetrics { featureName: string; timestamp: string; metrics: { tokensUsed: number; timeElapsed: number; // in seconds validationScore: number; // 0-100 securityScore: number; // 0-100 testCoverage: number; // percentage hallucinations: { detected: number; prevented: number; examples: string[]; }; errors: { syntax: number; runtime: number; type: number; }; }; improvements?: { tokenReduction?: number; timeReduction?: number; qualityIncrease?: number; }; } interface PerformanceReport { success: boolean; summary: { overallScore: number; efficiency: string; quality: string; security: string; }; recommendations: string[]; trends: { tokenUsage: 'improving' | 'stable' | 'degrading'; quality: 'improving' | 'stable' | 'degrading'; speed: 'improving' | 'stable' | 'degrading'; }; achievements: string[]; } export async function trackAgentPerformance( metrics: PerformanceMetrics ): Promise<PerformanceReport> { const report: PerformanceReport = { success: false, summary: { overallScore: 0, efficiency: '', quality: '', security: '', }, recommendations: [], trends: { tokenUsage: 'stable', quality: 'stable', speed: 'stable', }, achievements: [], }; try { // Calculate overall score const scores = { validation: metrics.metrics.validationScore, security: metrics.metrics.securityScore, coverage: metrics.metrics.testCoverage, efficiency: calculateEfficiencyScore(metrics), errorFree: calculateErrorScore(metrics), }; const overallScore = Math.round( (scores.validation * 0.25 + scores.security * 0.25 + scores.coverage * 0.2 + scores.efficiency * 0.15 + scores.errorFree * 0.15) ); // Update report summary report.summary.overallScore = overallScore; report.summary.efficiency = getEfficiencyRating(metrics); report.summary.quality = getQualityRating(scores.validation, scores.coverage); report.summary.security = getSecurityRating(scores.security); // Update agent memory with performance data updateAgentMemory(metrics, overallScore); // Analyze trends report.trends = analyzeTrends(metrics); // Generate recommendations report.recommendations = generateRecommendations(metrics, scores); // Check for achievements report.achievements = checkAchievements(metrics, overallScore); // Update context with current metrics updateAgentContext(metrics); report.success = true; } catch (error) { report.success = false; report.recommendations = [`Error tracking performance: ${error}`]; } return report; } function calculateEfficiencyScore(metrics: PerformanceMetrics): number { const baselineTokens = 2000; // Average tokens for similar features const tokenEfficiency = Math.max(0, 100 - ((metrics.metrics.tokensUsed - baselineTokens) / baselineTokens) * 50); const baselineTime = 300; // 5 minutes in seconds const timeEfficiency = Math.max(0, 100 - ((metrics.metrics.timeElapsed - baselineTime) / baselineTime) * 50); return Math.round((tokenEfficiency + timeEfficiency) / 2); } function calculateErrorScore(metrics: PerformanceMetrics): number { const totalErrors = metrics.metrics.errors.syntax + metrics.metrics.errors.runtime + metrics.metrics.errors.type; // Deduct 10 points per error, max 100 return Math.max(0, 100 - (totalErrors * 10)); } function getEfficiencyRating(metrics: PerformanceMetrics): string { const tokensPerMinute = metrics.metrics.tokensUsed / (metrics.metrics.timeElapsed / 60); if (tokensPerMinute < 300) return 'Excellent - Very efficient token usage'; if (tokensPerMinute < 500) return 'Good - Reasonable token usage'; if (tokensPerMinute < 800) return 'Fair - Could be more efficient'; return 'Needs Improvement - High token consumption'; } function getQualityRating(validation: number, coverage: number): string { const avgQuality = (validation + coverage) / 2; if (avgQuality >= 90) return 'Excellent - High quality code'; if (avgQuality >= 80) return 'Good - Solid implementation'; if (avgQuality >= 70) return 'Fair - Room for improvement'; return 'Needs Improvement - Quality issues detected'; } function getSecurityRating(score: number): string { if (score >= 95) return 'Excellent - No security issues'; if (score >= 85) return 'Good - Minor security considerations'; if (score >= 70) return 'Fair - Some security improvements needed'; return 'Critical - Security vulnerabilities detected'; } function updateAgentMemory(metrics: PerformanceMetrics, overallScore: number): void { const memoryPath = './AGENT-MEMORY.md'; if (existsSync(memoryPath)) { let memory = readFileSync(memoryPath, 'utf-8'); // Update performance history const performanceUpdate = ` - Feature: ${metrics.featureName} Score: ${overallScore}% Tokens: ${metrics.metrics.tokensUsed} Time: ${metrics.metrics.timeElapsed}s Coverage: ${metrics.metrics.testCoverage}% Date: ${metrics.timestamp}`; memory = memory.replace( 'improvement_trend: []', `improvement_trend: [${overallScore}]` ); // Update metrics memory = memory.replace( 'current_average: 0', `current_average: ${metrics.metrics.tokensUsed}` ); writeFileSync(memoryPath, memory); } } function updateAgentContext(metrics: PerformanceMetrics): void { const contextPath = './AGENT-CONTEXT.md'; if (existsSync(contextPath)) { let context = readFileSync(contextPath, 'utf-8'); // Update current metrics context = context.replace( 'tokens_used: 0', `tokens_used: ${metrics.metrics.tokensUsed}` ); context = context.replace( 'validation_score: 0', `validation_score: ${metrics.metrics.validationScore}` ); context = context.replace( 'security_score: 0', `security_score: ${metrics.metrics.securityScore}` ); context = context.replace( 'coverage_achieved: 0%', `coverage_achieved: ${metrics.metrics.testCoverage}%` ); writeFileSync(contextPath, context); } } function analyzeTrends(metrics: PerformanceMetrics): PerformanceReport['trends'] { // In a real implementation, this would compare with historical data // For now, we'll use the improvements field if provided const trends: PerformanceReport['trends'] = { tokenUsage: 'stable', quality: 'stable', speed: 'stable', }; if (metrics.improvements) { if (metrics.improvements.tokenReduction && metrics.improvements.tokenReduction > 10) { trends.tokenUsage = 'improving'; } else if (metrics.improvements.tokenReduction && metrics.improvements.tokenReduction < -10) { trends.tokenUsage = 'degrading'; } if (metrics.improvements.qualityIncrease && metrics.improvements.qualityIncrease > 5) { trends.quality = 'improving'; } else if (metrics.improvements.qualityIncrease && metrics.improvements.qualityIncrease < -5) { trends.quality = 'degrading'; } if (metrics.improvements.timeReduction && metrics.improvements.timeReduction > 10) { trends.speed = 'improving'; } else if (metrics.improvements.timeReduction && metrics.improvements.timeReduction < -10) { trends.speed = 'degrading'; } } return trends; } function generateRecommendations( metrics: PerformanceMetrics, scores: Record<string, number> ): string[] { const recommendations: string[] = []; // Token usage recommendations if (metrics.metrics.tokensUsed > 3000) { recommendations.push( 'Consider breaking down the feature into smaller components to reduce token usage' ); } // Test coverage recommendations if (scores.coverage < 80) { recommendations.push( `Increase test coverage from ${scores.coverage}% to at least 80% for better reliability` ); } // Security recommendations if (scores.security < 90) { recommendations.push( 'Review security checklist and address potential vulnerabilities' ); } // Error handling recommendations if (metrics.metrics.errors.runtime > 0) { recommendations.push( 'Add proper error handling to prevent runtime errors' ); } if (metrics.metrics.errors.type > 0) { recommendations.push( 'Fix TypeScript type errors for better type safety' ); } // Hallucination prevention if (metrics.metrics.hallucinations.detected > 0) { recommendations.push( `${metrics.metrics.hallucinations.detected} hallucinations detected. Always verify imports and APIs before use.` ); } // Performance recommendations if (metrics.metrics.timeElapsed > 600) { recommendations.push( 'Feature took over 10 minutes. Consider using more specific prompts or breaking into smaller tasks.' ); } if (recommendations.length === 0) { recommendations.push('Excellent work! Continue following best practices.'); } return recommendations; } function checkAchievements( metrics: PerformanceMetrics, overallScore: number ): string[] { const achievements: string[] = []; // Perfect score achievement if (overallScore === 100) { achievements.push('๐Ÿ† Perfect Score! Flawless implementation.'); } // Zero hallucination achievement if (metrics.metrics.hallucinations.detected === 0 && metrics.metrics.tokensUsed > 1000) { achievements.push('๐ŸŽฏ Zero Hallucinations! All code verified.'); } // High coverage achievement if (metrics.metrics.testCoverage >= 90) { achievements.push('๐Ÿงช Test Master! 90%+ coverage achieved.'); } // Security achievement if (metrics.metrics.securityScore === 100) { achievements.push('๐Ÿ›ก๏ธ Security Champion! No vulnerabilities detected.'); } // Efficiency achievement if (metrics.metrics.tokensUsed < 1500 && overallScore > 85) { achievements.push('โšก Efficiency Expert! High quality with low token usage.'); } // Speed achievement if (metrics.metrics.timeElapsed < 180 && overallScore > 85) { achievements.push('๐Ÿš€ Speed Demon! Feature completed in under 3 minutes.'); } // Error-free achievement const totalErrors = metrics.metrics.errors.syntax + metrics.metrics.errors.runtime + metrics.metrics.errors.type; if (totalErrors === 0 && metrics.metrics.tokensUsed > 500) { achievements.push('โœจ Error-Free! Perfect code on first try.'); } return achievements; }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/bswa006/mcp-context-manager'

If you have feedback or need assistance with the MCP directory API, please join our Discord server