Skip to main content
Glama
JJJHoons

Python Code Review MCP Agent

by JJJHoons

analyze_code_quality

Analyze Python code for style, maintainability, performance, and best practices compliance. Generate actionable insights to improve code quality and ensure adherence to standards.

Instructions

Deep code quality analysis including style, maintainability, performance, and best practices compliance.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
codeYesPython code to analyze for quality issues
filenameNoName of the file (optional)unknown.py
includeMaintainabilityNoInclude maintainability and documentation checks
includeStyleNoInclude style and naming convention checks

Implementation Reference

  • Main handler for 'analyze_code_quality' tool: validates input with QualityAnalysisSchema, analyzes code using PythonAnalyzer, filters issues by style/maintainability flags, generates custom quality report.
    private async handleQualityAnalysis(args: unknown) { const { code, filename, includeStyle, includeMaintainability } = QualityAnalysisSchema.parse(args); const result = this.analyzer.analyzePythonCode(code, filename); // Filter issues based on options let filteredIssues = result.issues; if (!includeStyle) { filteredIssues = filteredIssues.filter(issue => issue.type !== 'style' && !issue.rule.includes('naming-convention') ); } if (!includeMaintainability) { filteredIssues = filteredIssues.filter(issue => issue.type !== 'maintainability'); } const filteredResult = { ...result, issues: filteredIssues, totalIssues: filteredIssues.length }; const qualityReport = this.generateQualityReport(filteredResult); return { content: [ { type: 'text', text: qualityReport } ] };
  • Zod schema for validating input parameters to the analyze_code_quality tool.
    const QualityAnalysisSchema = z.object({ code: z.string().min(1, "Code cannot be empty"), filename: z.string().optional().default("unknown.py"), includeStyle: z.boolean().optional().default(true), includeMaintainability: z.boolean().optional().default(true) });
  • src/index.ts:126-153 (registration)
    Tool registration in ListToolsResponse, including name, description, and input schema.
    name: 'analyze_code_quality', description: 'Deep code quality analysis including style, maintainability, performance, and best practices compliance.', inputSchema: { type: 'object', properties: { code: { type: 'string', description: 'Python code to analyze for quality issues' }, filename: { type: 'string', description: 'Name of the file (optional)', default: 'unknown.py' }, includeStyle: { type: 'boolean', description: 'Include style and naming convention checks', default: true }, includeMaintainability: { type: 'boolean', description: 'Include maintainability and documentation checks', default: true } }, required: ['code'] } },
  • Helper method to format the quality analysis report used specifically by analyze_code_quality handler.
    private generateQualityReport(result: AnalysisResult): string { const sections = [ '📊 **CODE QUALITY ANALYSIS REPORT**', '=' + '='.repeat(50), `**File:** ${result.fileName}`, `**Quality Score:** ${result.codeQualityScore}/100 ${this.getQualityRating(result.codeQualityScore)}`, '', this.generateQualityBreakdown(result), '', this.generateQualityRecommendations(result) ]; return sections.join('\n'); }
  • Core analysis engine: scans Python code with regex patterns for issues, computes quality/security scores, produces AnalysisResult used by the tool handler.
    public analyzePythonCode(code: string, fileName: string = 'unknown.py'): AnalysisResult { const lines = code.split('\n'); const issues: CodeIssue[] = []; // Analyze each line lines.forEach((line, index) => { const lineNumber = index + 1; // Check security patterns this.securityPatterns.forEach(pattern => { if (pattern.pattern.test(line)) { issues.push({ type: 'security', severity: pattern.severity, line: lineNumber, message: pattern.message, rule: pattern.rule, codeSnippet: line.trim(), suggestion: this.getSuggestion(pattern.rule, line) }); } }); // Check quality patterns this.qualityPatterns.forEach(pattern => { if (pattern.pattern.test(line)) { issues.push({ type: 'quality', severity: pattern.severity, line: lineNumber, message: pattern.message, rule: pattern.rule, codeSnippet: line.trim(), suggestion: this.getSuggestion(pattern.rule, line) }); } }); // Check maintainability patterns this.maintainabilityPatterns.forEach(pattern => { if (pattern.pattern.test(line)) { issues.push({ type: 'maintainability', severity: pattern.severity, line: lineNumber, message: pattern.message, rule: pattern.rule, codeSnippet: line.trim(), suggestion: this.getSuggestion(pattern.rule, line) }); } }); }); // Multi-line analysis this.analyzeMultilinePatterns(code, issues); // Calculate metrics const criticalIssues = issues.filter(i => i.severity === 'critical').length; const highIssues = issues.filter(i => i.severity === 'high').length; const mediumIssues = issues.filter(i => i.severity === 'medium').length; const lowIssues = issues.filter(i => i.severity === 'low').length; const codeQualityScore = this.calculateCodeQualityScore(issues, lines.length); const securityScore = this.calculateSecurityScore(issues); return { fileName, totalLines: lines.length, totalIssues: issues.length, criticalIssues, highIssues, mediumIssues, lowIssues, issues: issues.sort((a, b) => { const severityOrder = { critical: 4, high: 3, medium: 2, low: 1 }; return severityOrder[b.severity] - severityOrder[a.severity] || a.line - b.line; }), summary: this.generateSummary(issues, lines.length), recommendations: this.generateRecommendations(issues), codeQualityScore, securityScore }; }

Latest Blog Posts

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/JJJHoons/python_code_review_mcp'

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