Skip to main content
Glama
index.ts47.9 kB
#!/usr/bin/env node import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, ErrorCode, ListResourcesRequestSchema, ListToolsRequestSchema, McpError, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; import axios from 'axios'; import type { OptimizationLevel, CodeAnalysisResult, GitHubRepo, ZigBuildConfig } from './types.js'; import { ZigBuildSystemHelper } from './zig-build.js'; import { ZigCodeAnalyzer, ZigStyleChecker, ZigCodeGenerator, Logger } from './utils.js'; /** * Main Zig MCP Server class * Provides comprehensive Zig language assistance including build system support */ class ZigServer { private readonly server: Server; private readonly version = '0.2.0'; constructor() { this.server = new Server( { name: 'zig-mcp-server', version: this.version, }, { capabilities: { resources: {}, tools: {}, }, } ); this.setupResourceHandlers(); this.setupToolHandlers(); this.server.onerror = error => Logger.error('MCP Error', error); // Graceful shutdown handling process.on('SIGINT', async () => { Logger.info('Received SIGINT, shutting down gracefully...'); await this.server.close(); process.exit(0); }); process.on('SIGTERM', async () => { Logger.info('Received SIGTERM, shutting down gracefully...'); await this.server.close(); process.exit(0); }); Logger.info(`Zig MCP Server v${this.version} initialized`); } private setupResourceHandlers(): void { this.server.setRequestHandler(ListResourcesRequestSchema, async () => ({ resources: [ { uri: 'zig://docs/language-reference', name: 'Zig Language Reference', description: 'Official Zig language documentation and reference guide', mimeType: 'text/html', }, { uri: 'zig://docs/std-lib', name: 'Zig Standard Library Documentation', description: 'Documentation for the Zig standard library', mimeType: 'text/html', }, { uri: 'zig://repos/popular', name: 'Popular Zig Repositories', description: 'List of most popular Zig repositories on GitHub with insights', mimeType: 'application/json', }, { uri: 'zig://build/best-practices', name: 'Zig Build System Best Practices', description: 'Comprehensive guide to modern Zig build system patterns', mimeType: 'text/markdown', }, { uri: 'zig://build/troubleshooting', name: 'Build System Troubleshooting', description: 'Common build issues and their solutions', mimeType: 'text/markdown', }, { uri: 'zig://examples/build-configs', name: 'Example Build Configurations', description: 'Sample build.zig files for different project types', mimeType: 'text/plain', }, ], })); this.server.setRequestHandler(ReadResourceRequestSchema, async request => { const { uri } = request.params; Logger.debug(`Fetching resource: ${uri}`); try { switch (uri) { case 'zig://docs/language-reference': return { contents: [ { uri, mimeType: 'text/html', text: await this.fetchZigDocs('language'), }, ], }; case 'zig://docs/std-lib': return { contents: [ { uri, mimeType: 'text/html', text: await this.fetchZigDocs('std'), }, ], }; case 'zig://repos/popular': return { contents: [ { uri, mimeType: 'application/json', text: await this.fetchPopularRepos(), }, ], }; case 'zig://build/best-practices': return { contents: [ { uri, mimeType: 'text/markdown', text: ZigBuildSystemHelper.getBuildSystemBestPractices(), }, ], }; case 'zig://build/troubleshooting': return { contents: [ { uri, mimeType: 'text/markdown', text: ZigBuildSystemHelper.getBuildTroubleshooting(), }, ], }; case 'zig://examples/build-configs': return { contents: [ { uri, mimeType: 'text/plain', text: this.generateBuildExamples(), }, ], }; default: throw new McpError(ErrorCode.InvalidRequest, `Resource not found: ${uri}`); } } catch (error) { Logger.error(`Failed to fetch resource ${uri}`, error as Error); throw error; } }); } private setupToolHandlers(): void { this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [ { name: 'optimize_code', description: 'Optimize Zig code for better performance with modern patterns', inputSchema: { type: 'object', properties: { code: { type: 'string', description: 'Zig code to optimize', }, optimizationLevel: { type: 'string', enum: ['Debug', 'ReleaseSafe', 'ReleaseFast', 'ReleaseSmall'], description: 'Optimization level to target', default: 'ReleaseSafe', }, }, required: ['code'], }, }, { name: 'estimate_compute_units', description: 'Estimate computational complexity and resource usage with detailed analysis', inputSchema: { type: 'object', properties: { code: { type: 'string', description: 'Zig code to analyze', }, }, required: ['code'], }, }, { name: 'generate_code', description: 'Generate modern Zig code from natural language descriptions', inputSchema: { type: 'object', properties: { prompt: { type: 'string', description: 'Natural language description of desired code', }, context: { type: 'string', description: 'Additional context or requirements', }, }, required: ['prompt'], }, }, { name: 'get_recommendations', description: 'Get comprehensive, multi-dimensional code analysis with 10+ specialized analyzers covering style, safety, performance, concurrency, metaprogramming, testing, build systems, interop, metrics, and modern Zig patterns', inputSchema: { type: 'object', properties: { code: { type: 'string', description: 'Zig code to analyze', }, prompt: { type: 'string', description: 'Natural language query for specific recommendations (performance, safety, maintainability, concurrency, architecture, etc.)', }, }, required: ['code'], }, }, { name: 'generate_build_zig', description: 'Generate a modern build.zig file with best practices', inputSchema: { type: 'object', properties: { projectName: { type: 'string', description: 'Name of the project', default: 'my-project', }, projectType: { type: 'string', enum: ['executable', 'library', 'both'], description: 'Type of project to generate', default: 'executable', }, zigVersion: { type: 'string', description: 'Target Zig version', default: '0.15.2', }, dependencies: { type: 'array', items: { type: 'string' }, description: 'List of dependencies to include', default: [], }, }, required: [], }, }, { name: 'analyze_build_zig', description: 'Analyze a build.zig file and provide modernization recommendations', inputSchema: { type: 'object', properties: { buildZigContent: { type: 'string', description: 'Content of the build.zig file to analyze', }, }, required: ['buildZigContent'], }, }, { name: 'generate_build_zon', description: 'Generate a build.zig.zon file for dependency management', inputSchema: { type: 'object', properties: { projectName: { type: 'string', description: 'Name of the project', default: 'my-project', }, dependencies: { type: 'array', items: { type: 'object', properties: { name: { type: 'string' }, url: { type: 'string' }, }, required: ['name', 'url'], }, description: 'List of dependencies with their URLs', default: [], }, }, required: [], }, }, ], })); this.server.setRequestHandler(CallToolRequestSchema, async request => { const { name, arguments: args } = request.params; Logger.debug(`Tool called: ${name}`); try { switch (name) { case 'optimize_code': this.validateStringParam(args?.code, 'code'); return { content: [ { type: 'text', text: await this.optimizeCode( args.code, (args.optimizationLevel as OptimizationLevel) ?? 'ReleaseSafe' ), }, ], }; case 'estimate_compute_units': this.validateStringParam(args?.code, 'code'); return { content: [ { type: 'text', text: await this.estimateComputeUnits(args.code), }, ], }; case 'generate_code': this.validateStringParam(args?.prompt, 'prompt'); return { content: [ { type: 'text', text: await this.generateCode(args.prompt, args.context as string | undefined), }, ], }; case 'get_recommendations': this.validateStringParam(args?.code, 'code'); return { content: [ { type: 'text', text: await this.getRecommendations(args.code, args.prompt as string | undefined), }, ], }; case 'generate_build_zig': return { content: [ { type: 'text', text: await this.generateBuildZig(args || {}), }, ], }; case 'analyze_build_zig': this.validateStringParam(args?.buildZigContent, 'buildZigContent'); return { content: [ { type: 'text', text: this.analyzeBuildZig(args.buildZigContent), }, ], }; case 'generate_build_zon': return { content: [ { type: 'text', text: this.generateBuildZon(args || {}), }, ], }; default: throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`); } } catch (error) { Logger.error(`Tool execution failed for ${name}`, error as Error); throw error; } }); } private validateStringParam(value: unknown, paramName: string): asserts value is string { if (typeof value !== 'string') { throw new McpError(ErrorCode.InvalidParams, `${paramName} parameter must be a string`); } } private async fetchZigDocs(section: 'language' | 'std'): Promise<string> { try { Logger.debug(`Fetching Zig docs for section: ${section}`); // Fetch from Zig's official documentation const url = `https://ziglang.org/documentation/master/${section === 'language' ? 'index' : 'std'}.html`; const response = await axios.get(url, { timeout: 10000, // 10 second timeout headers: { 'User-Agent': 'zig-mcp-server/0.2.0', }, }); Logger.debug(`Successfully fetched Zig docs for ${section}`); return response.data; } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error'; Logger.error(`Failed to fetch Zig docs for ${section}`, error as Error); throw new McpError(ErrorCode.InternalError, `Failed to fetch Zig docs: ${errorMessage}`); } } private async fetchPopularRepos(): Promise<string> { try { Logger.debug('Fetching popular Zig repositories'); const response = await axios.get('https://api.github.com/search/repositories', { params: { q: 'language:zig', sort: 'stars', order: 'desc', per_page: 10, }, headers: { Accept: 'application/vnd.github.v3+json', 'User-Agent': 'zig-mcp-server/0.2.0', ...(process.env.GITHUB_TOKEN && { Authorization: `token ${process.env.GITHUB_TOKEN}`, }), }, timeout: 10000, // 10 second timeout }); const repos: GitHubRepo[] = response.data.items.map((repo: any) => ({ name: repo.full_name, description: repo.description || 'No description available', stars: repo.stargazers_count, url: repo.html_url, })); Logger.debug(`Successfully fetched ${repos.length} popular repositories`); return JSON.stringify(repos, null, 2); } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error'; Logger.error('Failed to fetch popular repositories', error as Error); throw new McpError(ErrorCode.InternalError, `Failed to fetch popular repos: ${errorMessage}`); } } private async optimizeCode( code: string, level: OptimizationLevel = 'ReleaseSafe' ): Promise<string> { Logger.debug(`Optimizing code for level: ${level}`); // Analyze code for optimization opportunities const optimizations: string[] = []; // Check for common patterns that can be optimized if (code.includes('std.ArrayList')) { optimizations.push('Consider pre-allocating ArrayList capacity if size is known'); optimizations.push( 'Use ArrayListUnmanaged for better cache locality and reduced indirection' ); } if (code.includes('std.fmt.allocPrint')) { optimizations.push('Consider using std.fmt.bufPrint for stack allocation when possible'); } if (code.match(/while\s*\(true\)/)) { optimizations.push('Consider using labeled breaks instead of while(true)'); } if (code.includes('@intCast') && !code.includes('try')) { optimizations.push('Use safe integer casting: try std.math.cast() instead of @intCast'); } if (code.match(/for\s*\([^)]*\)\s*\{[^}]*std\.fmt\.print/)) { optimizations.push('Avoid I/O operations in hot loops for better performance'); } // SIMD and vectorization opportunities if (code.match(/for\s*\([^)]*\)\s*\|[^|]*\|\s*{[^}]*[+\-*/][^}]*}/)) { optimizations.push('Consider using @Vector for SIMD operations on numeric arrays'); } if (code.includes('[]f32') || code.includes('[]f64')) { optimizations.push('Float arrays can benefit from vectorized operations using @Vector'); } // Comptime optimizations if (code.match(/const\s+\w+\s*=\s*\d+/)) { optimizations.push('Move constant calculations to comptime using comptime var'); } if (code.includes('std.crypto') || code.includes('std.hash')) { optimizations.push('Consider comptime evaluation for constant hash/crypto operations'); } // Memory layout optimizations if (code.includes('struct {')) { optimizations.push('Consider using packed struct for memory efficiency if appropriate'); optimizations.push('Order struct fields by size (largest first) for optimal packing'); } // Function call optimizations if (code.match(/fn\s+\w+[^{]*{[^}]{1,50}}/)) { optimizations.push('Consider @inline for small hot functions (under ~50 lines)'); } if (code.includes('std.math')) { optimizations.push( 'Use builtin math functions like @sqrt, @sin, @cos for better performance' ); } // Modern Zig collection optimizations if (code.includes('std.HashMap')) { optimizations.push('Consider ArrayHashMap for better cache locality with small datasets'); optimizations.push('Use HashMap.initWithContext for custom hash/equality functions'); } if (code.includes('std.MultiArrayList')) { optimizations.push( 'MultiArrayList provides better cache efficiency for struct-of-arrays pattern' ); } // Build mode specific optimizations const buildModeOpts = { Debug: [ 'Debug symbols enabled', 'Runtime safety checks enabled', 'No optimizations - fastest compile time', ], ReleaseSafe: [ 'Runtime safety checks enabled', 'Optimizations enabled', 'Good balance of safety and performance', ], ReleaseFast: [ 'Runtime safety checks disabled', 'Maximum performance optimizations', 'Consider adding debug assertions for critical paths', 'Use @setRuntimeSafety(true) for critical sections if needed', ], ReleaseSmall: [ 'Size optimizations enabled', 'Consider removing debug information', 'Minimize template instantiations', 'Use packed structs to reduce memory footprint', ], } as const; const modeSpecificOpts = buildModeOpts[level]; return ` # Optimization Analysis for ${level} ## General Optimizations: ${optimizations.length > 0 ? optimizations.map(opt => `- ${opt}`).join('\n') : '- No immediate optimization opportunities detected'} ## Build Mode Specific: ${modeSpecificOpts.map(opt => `- ${opt}`).join('\n')} ## Modern Zig Patterns to Consider: - Use comptime for compile-time computations - Leverage Zig's zero-cost abstractions - Consider using packed structs for memory efficiency - Use defer for automatic cleanup - Implement proper error handling with error unions ## Optimized Code Suggestions: \`\`\`zig ${this.generateOptimizedCodeSuggestions(code, level)} \`\`\` `.trim(); } private generateOptimizedCodeSuggestions(code: string, level: OptimizationLevel): string { let optimizedCode = code; // Apply common optimizations if (optimizedCode.includes('std.ArrayList') && !optimizedCode.includes('initCapacity')) { optimizedCode = optimizedCode.replace( /std\.ArrayList\([^)]+\)\.init\([^)]+\)/, 'std.ArrayList($1).initCapacity(allocator, expected_capacity)' ); } // Add safety annotations for ReleaseFast if (level === 'ReleaseFast' && !optimizedCode.includes('@setRuntimeSafety')) { optimizedCode = `// Consider adding runtime safety for critical sections:\n// @setRuntimeSafety(true);\n\n${optimizedCode}`; } return optimizedCode; } private async estimateComputeUnits(code: string): Promise<string> { Logger.debug('Estimating compute units for code'); // Analyze code for computational complexity using new utility classes const analysis: CodeAnalysisResult = { memoryUsage: ZigCodeAnalyzer.analyzeMemoryUsage(code), timeComplexity: ZigCodeAnalyzer.analyzeTimeComplexity(code), allocations: ZigCodeAnalyzer.analyzeAllocations(code), }; return ` # Compute Units Estimation ## Memory Usage: ${analysis.memoryUsage} ## Time Complexity: ${analysis.timeComplexity} ## Allocation Analysis: ${analysis.allocations} ## Recommendations: - Consider using arena allocators for batch allocations - Profile memory usage with --enable-logging - Use comptime evaluation to reduce runtime overhead - Consider memory pool allocation for frequent allocations `.trim(); } private analyzeMemoryUsage(code: string): string { const patterns = { heapAlloc: /std\.(ArrayList|StringHashMap|AutoHashMap|HashMap)/g, stackAlloc: /var\s+\w+\s*:\s*\[(\d+)\]/g, slices: /\[\](?:u8|i32|f64|usize|isize|f32|i64|u32|u64|i16|u16)/g, multiArrayList: /std\.MultiArrayList/g, boundedArray: /std\.BoundedArray/g, vectorTypes: /@Vector\(\s*\d+\s*,/g, packedStruct: /packed\s+struct/g, alignedTypes: /@alignOf|align\(\d+\)/g, allocators: /std\.heap\.(ArenaAllocator|FixedBufferAllocator|GeneralPurposeAllocator|page_allocator)/g, arrayListUnmanaged: /ArrayListUnmanaged/g, simdAlignment: /@alignOf\(.*@Vector/g, }; const heapAllocs = (code.match(patterns.heapAlloc) || []).length; const stackAllocs = (code.match(patterns.stackAlloc) || []).length; const sliceUsage = (code.match(patterns.slices) || []).length; const multiArrayLists = (code.match(patterns.multiArrayList) || []).length; const boundedArrays = (code.match(patterns.boundedArray) || []).length; const vectorTypes = (code.match(patterns.vectorTypes) || []).length; const packedStructs = (code.match(patterns.packedStruct) || []).length; const alignedTypes = (code.match(patterns.alignedTypes) || []).length; const allocators = (code.match(patterns.allocators) || []).length; const arrayListUnmanaged = (code.match(patterns.arrayListUnmanaged) || []).length; const simdAlignment = (code.match(patterns.simdAlignment) || []).length; const recommendations = []; if (heapAllocs > arrayListUnmanaged && heapAllocs > 0) { recommendations.push('Consider ArrayListUnmanaged for reduced pointer indirection'); } if (vectorTypes > 0 && simdAlignment === 0) { recommendations.push('Ensure SIMD vectors are properly aligned for optimal performance'); } if (sliceUsage > 0 && multiArrayLists === 0 && heapAllocs > 2) { recommendations.push( 'Consider MultiArrayList for better cache locality with multiple arrays' ); } if (stackAllocs === 0 && boundedArrays === 0 && heapAllocs > 0) { recommendations.push('Consider BoundedArray for small, stack-allocated dynamic arrays'); } return ` - Heap Allocations: ${heapAllocs} detected - Stack Allocations: ${stackAllocs} detected - Slice Usage: ${sliceUsage} instances - MultiArrayList: ${multiArrayLists} instances (SoA pattern for cache efficiency) - BoundedArray: ${boundedArrays} instances (stack-allocated dynamic arrays) - Vector Types: ${vectorTypes} instances (SIMD support) - Packed Structs: ${packedStructs} instances (memory optimization) - Aligned Types: ${alignedTypes} instances (alignment optimization) - Custom Allocators: ${allocators} instances - ArrayListUnmanaged: ${arrayListUnmanaged} instances (reduced overhead) - Memory Profile: ${heapAllocs > stackAllocs ? 'Heap-heavy' : 'Stack-optimized'} ${recommendations.length > 0 ? '\nRecommendations:\n' + recommendations.map(r => `- ${r}`).join('\n') : ''} `.trim(); } private analyzeTimeComplexity(code: string): string { const patterns = { loops: /(?:while|for)\s*\(/g, nestedLoops: /(?:while|for)[^{]*\{[^}]*(?:while|for)/g, recursion: /fn\s+\w+[^{]*\{[^}]*\w+\s*\([^)]*\)/g, vectorOperations: /@Vector\([^)]*\)[^;]*[+\-*/]/g, builtinMath: /@(?:sqrt|sin|cos|exp|log|pow)\s*\(/g, memoryOps: /@(?:memcpy|memset|memmove)\s*\(/g, simdReductions: /@reduce\s*\(/g, parallelizable: /std\.Thread|std\.atomic/g, }; const loops = (code.match(patterns.loops) || []).length; const nestedLoops = (code.match(patterns.nestedLoops) || []).length; const recursion = (code.match(patterns.recursion) || []).length; const vectorOps = (code.match(patterns.vectorOperations) || []).length; const builtinMath = (code.match(patterns.builtinMath) || []).length; const memoryOps = (code.match(patterns.memoryOps) || []).length; const simdReductions = (code.match(patterns.simdReductions) || []).length; const parallelizable = (code.match(patterns.parallelizable) || []).length; let complexity = 'O(1)'; if (nestedLoops > 0) { complexity = 'O(n²)'; } else if (loops > 0) { complexity = 'O(n)'; } if (recursion > 0) { complexity += ' with recursive calls'; } const optimizationNotes: string[] = []; if (vectorOps === 0 && loops > 0) { optimizationNotes.push('Consider vectorization for numeric operations'); } if (parallelizable > 0) { optimizationNotes.push('Thread safety requires careful synchronization'); } return ` - Estimated Complexity: ${complexity} - Loop Count: ${loops} - Nested Loops: ${nestedLoops} - Recursive Patterns: ${recursion} detected - Vector Operations: ${vectorOps} (SIMD optimization opportunities) - Builtin Math Functions: ${builtinMath} (hardware-optimized) - Memory Operations: ${memoryOps} (optimized bulk operations) - SIMD Reductions: ${simdReductions} (parallel reductions) - Threading/Atomic Operations: ${parallelizable} (parallelization potential) ${optimizationNotes.length > 0 ? '\nOptimization Notes:\n' + optimizationNotes.map(note => `- ${note}`).join('\n') : ''} `.trim(); } private analyzeAllocations(code: string): string { const patterns = { comptime: /comptime\s/g, arena: /std\.heap\.ArenaAllocator/g, fixedBuf: /std\.heap\.FixedBufferAllocator/g, gpa: /std\.heap\.GeneralPurposeAllocator/g, pageAlloc: /std\.heap\.page_allocator/g, stackFallback: /std\.heap\.StackFallbackAllocator/g, alignedAlloc: /alignedAlloc|@alignOf/g, defer: /defer\s/g, errdefer: /errdefer\s/g, embedFile: /@embedFile\s*\(/g, comptimeEval: /comptime\s+{[^}]+}/g, }; const comptimeUsage = (code.match(patterns.comptime) || []).length; const arenaAlloc = (code.match(patterns.arena) || []).length; const fixedBufAlloc = (code.match(patterns.fixedBuf) || []).length; const gpaAlloc = (code.match(patterns.gpa) || []).length; const pageAlloc = (code.match(patterns.pageAlloc) || []).length; const stackFallback = (code.match(patterns.stackFallback) || []).length; const alignedAllocs = (code.match(patterns.alignedAlloc) || []).length; const deferUsage = (code.match(patterns.defer) || []).length; const errdeferUsage = (code.match(patterns.errdefer) || []).length; const embedFileUsage = (code.match(patterns.embedFile) || []).length; const comptimeEvals = (code.match(patterns.comptimeEval) || []).length; const allocatorRecommendations = []; if (arenaAlloc === 0 && fixedBufAlloc === 0 && gpaAlloc === 0) { allocatorRecommendations.push('Consider using specialized allocators for better performance'); } if (alignedAllocs > 0) { allocatorRecommendations.push('SIMD-aligned allocations detected - good for vectorization'); } if (deferUsage === 0 && (arenaAlloc > 0 || fixedBufAlloc > 0)) { allocatorRecommendations.push('Add defer statements for proper cleanup'); } if (embedFileUsage > 0) { allocatorRecommendations.push('Compile-time file embedding reduces runtime I/O'); } return ` - Comptime Evaluations: ${comptimeUsage} (compile-time optimization) - Comptime Blocks: ${comptimeEvals} (complex compile-time evaluation) - Arena Allocators: ${arenaAlloc} (batch allocation/cleanup) - Fixed Buffer Allocators: ${fixedBufAlloc} (stack-based allocation) - General Purpose Allocators: ${gpaAlloc} (debugging/development) - Page Allocators: ${pageAlloc} (large allocations) - Stack Fallback Allocators: ${stackFallback} (hybrid stack/heap) - Aligned Allocations: ${alignedAllocs} (SIMD optimization) - Defer Statements: ${deferUsage} (cleanup automation) - Errdefer Statements: ${errdeferUsage} (error cleanup) - Embedded Files: ${embedFileUsage} (compile-time resources) - Allocation Strategy: ${this.determineAllocStrategy(arenaAlloc, fixedBufAlloc, gpaAlloc, pageAlloc)} ${allocatorRecommendations.length > 0 ? '\nAllocator Recommendations:\n' + allocatorRecommendations.map(r => `- ${r}`).join('\n') : ''} `.trim(); } private determineAllocStrategy( arenaCount: number, fixedBufCount: number, gpaCount: number, pageAllocCount: number ): string { const counts = { arenaCount, fixedBufCount, gpaCount, pageAllocCount }; const activeStrategies = Object.entries(counts).filter(([_, count]) => count > 0); if (activeStrategies.length > 1) { return 'Mixed allocation strategy'; } if (arenaCount > 0) { return 'Arena-based allocation'; } if (fixedBufCount > 0) { return 'Fixed buffer allocation'; } if (gpaCount > 0) { return 'General purpose allocation'; } if (pageAllocCount > 0) { return 'Page-based allocation'; } return 'Default allocator usage'; } private async generateCode(prompt: string, context?: string): Promise<string> { Logger.debug(`Generating code for prompt: ${prompt}`); // Parse requirements and generate appropriate code using new utility classes const requirements = ZigCodeGenerator.parseRequirements(prompt, context); const code = ZigCodeGenerator.generateZigCode(requirements); return ` # Generated Zig Code ${code} ## Generation Notes: - Code follows modern Zig patterns and style guide - Includes comprehensive error handling where appropriate - Uses comptime optimizations when beneficial - Includes basic tests and documentation - Follows zero-cost abstraction principles ## Next Steps: 1. Review and customize the generated code for your specific needs 2. Add comprehensive tests 3. Consider performance implications for your use case 4. Add proper documentation comments `.trim(); } private async getRecommendations(code: string, prompt?: string): Promise<string> { Logger.debug(`Analyzing code for recommendations${prompt ? ` with focus: ${prompt}` : ''}`); // Comprehensive analysis using all enhanced analysis methods const analysis = { style: ZigStyleChecker.analyzeCodeStyle(code), patterns: ZigStyleChecker.analyzePatterns(code), safety: ZigStyleChecker.analyzeSafety(code), performance: ZigStyleChecker.analyzePerformance(code), concurrency: ZigStyleChecker.analyzeConcurrency(code), metaprogramming: ZigStyleChecker.analyzeMetaprogramming(code), testing: ZigStyleChecker.analyzeTesting(code), buildSystem: ZigStyleChecker.analyzeBuildSystem(code), interop: ZigStyleChecker.analyzeInterop(code), metrics: ZigStyleChecker.analyzeCodeMetrics(code), modernPatterns: ZigStyleChecker.analyzeModernZigPatterns(code), }; let recommendations = ` # 🔍 Comprehensive Zig Code Analysis ## 📐 Style and Conventions ${analysis.style} ## 🏗️ Design Patterns & Architecture ${analysis.patterns} ## 🛡️ Safety & Security Analysis ${analysis.safety} ## ⚡ Performance Analysis ${analysis.performance} ## 🧵 Concurrency & Threading ${analysis.concurrency} ## 🎨 Metaprogramming & Compile-time ${analysis.metaprogramming} ## 🧪 Testing & Quality Assurance ${analysis.testing} ## 🔧 Build System Integration ${analysis.buildSystem} ## 🔗 Interoperability ${analysis.interop} ## 📊 Code Metrics & Maintainability ${analysis.metrics} ## ✨ Modern Zig Patterns (0.15.2+) ${analysis.modernPatterns} ## 🎯 Best Practices Summary - **Memory Management**: Use RAII patterns with defer, prefer arena allocators for batch operations - **Error Handling**: Implement comprehensive error unions and proper propagation - **Performance**: Leverage comptime evaluation, consider SIMD for data-parallel operations - **Safety**: Enable runtime safety in debug builds, use explicit initialization - **Testing**: Maintain high test coverage with property-based testing where applicable - **Documentation**: Use comprehensive doc comments (//!) for modules and (///) for functions - **Modern Patterns**: Adopt Zig 0.15.2+ syntax with b.path() and root_module APIs - **Build System**: Use build.zig.zon for dependency management, support cross-compilation - **Code Quality**: Maintain low cyclomatic complexity, follow single responsibility principle - **Concurrency**: Use proper synchronization primitives, consider async/await for I/O bound tasks ## 🚀 Advanced Optimization Recommendations - **Compile-time Optimization**: Move more computations to comptime where possible - **Memory Layout**: Use packed structs for memory-critical applications - **SIMD Utilization**: Consider vectorization for mathematical operations - **Profile-Guided Optimization**: Use zig build -Doptimize=ReleaseFast -Dcpu=native - **Static Analysis**: Integrate additional linting tools in your build pipeline - **Fuzzing**: Implement fuzz testing for input validation functions - **Benchmarking**: Add performance regression tests for critical paths `.trim(); // Add context-specific recommendations based on the prompt if (prompt) { recommendations += `\n\n## 🎯 Specific Recommendations for "${prompt}":\n`; recommendations += this.getSpecificRecommendations(code, prompt); // Add advanced context-specific analysis recommendations += this.getAdvancedContextRecommendations(code, prompt); } return recommendations; } private getAdvancedContextRecommendations(code: string, prompt: string): string { const advanced: string[] = []; const contextLower = prompt.toLowerCase(); // === PERFORMANCE CONTEXT === if (contextLower.includes('performance') || contextLower.includes('optimization')) { advanced.push('\n### 🔥 Advanced Performance Strategies:'); advanced.push('- **Hot Path Analysis**: Profile with perf to identify bottlenecks'); advanced.push( '- **Memory Allocator Tuning**: Consider custom allocators for specific workloads' ); advanced.push('- **Cache Optimization**: Align data structures to cache line boundaries'); advanced.push('- **Branch Prediction**: Use @branchHint for predictable branches'); advanced.push('- **Inlining Strategy**: Profile inline vs call overhead for hot functions'); advanced.push('- **SIMD Exploitation**: Use @Vector for parallel arithmetic operations'); advanced.push( '- **Compile-time Constants**: Move runtime calculations to comptime where possible' ); } // === SAFETY CONTEXT === if (contextLower.includes('safety') || contextLower.includes('security')) { advanced.push('\n### 🛡️ Advanced Safety & Security:'); advanced.push('- **Memory Safety**: Enable AddressSanitizer in debug builds'); advanced.push('- **Integer Safety**: Use @setRuntimeSafety(true) for critical calculations'); advanced.push('- **Crypto Safety**: Use constant-time operations for sensitive data'); advanced.push('- **Input Validation**: Implement comprehensive bounds checking'); advanced.push('- **Error Recovery**: Design graceful degradation for error conditions'); advanced.push('- **Resource Limits**: Implement timeouts and resource quotas'); advanced.push('- **Fuzzing Strategy**: Generate test cases for edge conditions'); } // === MAINTAINABILITY CONTEXT === if (contextLower.includes('maintainability') || contextLower.includes('refactor')) { advanced.push('\n### 🔧 Advanced Maintainability:'); advanced.push('- **Module Design**: Follow single responsibility principle strictly'); advanced.push('- **API Design**: Minimize public surface area, use const parameters'); advanced.push("- **Type Safety**: Leverage Zig's type system for compile-time guarantees"); advanced.push('- **Documentation**: Use doctests for executable examples'); advanced.push('- **Versioning**: Plan for API evolution with semantic versioning'); advanced.push( '- **Testing Strategy**: Implement property-based testing for complex functions' ); advanced.push('- **Code Metrics**: Monitor complexity trends over time'); } // === CONCURRENCY CONTEXT === if ( contextLower.includes('concurrent') || contextLower.includes('thread') || contextLower.includes('async') ) { advanced.push('\n### 🧵 Advanced Concurrency Patterns:'); advanced.push('- **Lock-free Design**: Use atomic operations where possible'); advanced.push('- **Work Stealing**: Implement efficient task distribution'); advanced.push('- **Memory Ordering**: Understand acquire/release semantics'); advanced.push('- **Async Patterns**: Design for cooperative multitasking'); advanced.push('- **Resource Pooling**: Minimize allocation in concurrent contexts'); advanced.push('- **Deadlock Prevention**: Establish lock ordering conventions'); advanced.push('- **Performance Monitoring**: Track contention and utilization metrics'); } // === ARCHITECTURE CONTEXT === if (contextLower.includes('architecture') || contextLower.includes('design')) { advanced.push('\n### 🏗️ Advanced Architectural Patterns:'); advanced.push('- **Dependency Injection**: Use comptime-based DI for testability'); advanced.push('- **Event Sourcing**: Consider immutable event logs for state management'); advanced.push('- **Plugin Architecture**: Design for extensibility with comptime interfaces'); advanced.push('- **Error Boundaries**: Implement fault isolation strategies'); advanced.push('- **Configuration Management**: Use comptime for compile-time configuration'); advanced.push('- **Observability**: Build in logging, metrics, and tracing from the start'); advanced.push('- **Backward Compatibility**: Plan for API evolution strategies'); } return advanced.join('\n'); } private getSpecificRecommendations(code: string, prompt: string): string { const recommendations: string[] = []; // Add context-specific recommendations based on the prompt if (prompt.toLowerCase().includes('performance')) { recommendations.push('- Use comptime when possible to move computations to compile time'); recommendations.push('- Consider using packed structs for memory optimization'); recommendations.push('- Implement custom allocators for specific use cases'); recommendations.push('- Profile with `zig build -Doptimize=ReleaseFast` for production'); recommendations.push('- Use SIMD operations for data-parallel computations'); } if (prompt.toLowerCase().includes('safety')) { recommendations.push('- Add bounds checking for array access'); recommendations.push('- Use explicit error handling with try/catch'); recommendations.push('- Implement proper resource cleanup with defer'); recommendations.push('- Avoid undefined behavior with proper initialization'); recommendations.push('- Use runtime safety checks in debug builds'); } if (prompt.toLowerCase().includes('maintainability')) { recommendations.push('- Add comprehensive documentation with //! and ///'); recommendations.push('- Break down complex functions into smaller, focused units'); recommendations.push('- Use meaningful variable and function names'); recommendations.push('- Implement proper module structure'); recommendations.push('- Add comprehensive test coverage'); } // Check for outdated Zig syntax (pre-0.11) if (code.match(/@intCast\(\s*\w+\s*,/)) { recommendations.push( '- Update @intCast syntax: use @intCast(value) instead of @intCast(Type, value)' ); } if (code.match(/@floatCast\(\s*\w+\s*,/)) { recommendations.push( '- Update @floatCast syntax: use @floatCast(value) instead of @floatCast(Type, value)' ); } if (prompt.toLowerCase().includes('memory')) { recommendations.push('- Consider arena allocators for batch allocations'); recommendations.push('- Use fixed buffer allocators for known-size data'); recommendations.push('- Implement proper deinitialization patterns'); recommendations.push('- Profile memory usage in production scenarios'); } return recommendations.length > 0 ? recommendations.join('\n') : '- No specific recommendations for this context'; } private async generateBuildZig(args: Record<string, any>): Promise<string> { Logger.debug('Generating build.zig file'); const config: Partial<ZigBuildConfig> = { zigVersion: args.zigVersion || '0.15.2', buildMode: args.optimizationLevel || 'ReleaseSafe', dependencies: {}, buildSteps: [], }; // Add dependencies if provided if (Array.isArray(args.dependencies)) { for (const dep of args.dependencies) { config.dependencies![dep] = `dependency("${dep}")`; } } const buildZigContent = ZigBuildSystemHelper.generateBuildZig(config); return ` # Generated build.zig \`\`\`zig ${buildZigContent} \`\`\` ## Usage Instructions: 1. **Build the project:** \`\`\`bash zig build \`\`\` 2. **Run the application:** \`\`\`bash zig build run \`\`\` 3. **Run tests:** \`\`\`bash zig build test \`\`\` 4. **Build for different targets:** \`\`\`bash zig build -Dtarget=x86_64-windows-gnu zig build -Dtarget=aarch64-linux-gnu \`\`\` 5. **Different optimization modes:** \`\`\`bash zig build -Doptimize=Debug zig build -Doptimize=ReleaseFast \`\`\` ## Next Steps: - Customize the build script for your specific needs - Add additional build steps or dependencies as required - Consider using build.zig.zon for dependency management `.trim(); } private analyzeBuildZig(buildZigContent: string): string { Logger.debug('Analyzing build.zig content'); const recommendations = ZigBuildSystemHelper.analyzeBuildZig(buildZigContent); return ` # Build.zig Analysis Results ## Recommendations: ${recommendations.map(rec => `- ${rec}`).join('\n')} ## Modern Zig Build System Features to Consider: ### 1. Modern Module System (Zig 0.15.2+) - Use build.zig.zon for managing dependencies - Replace manual @import() with b.dependency() ### 2. Cross-compilation Support - Use standardTargetOptions() for flexible target selection - Support multiple architectures out of the box ### 3. Build Options - Add configurable build options with b.addOptions() - Support feature flags and conditional compilation ### 4. Testing Integration - Include comprehensive test steps - Support different test configurations ### 5. Documentation Generation - Add documentation generation steps - Include examples and usage guides ## Example Modernization: \`\`\`zig // Old pattern (pre-0.11) exe.setTarget(target); exe.setBuildMode(mode); // Zig 0.12 pattern const exe = b.addExecutable(.{ .name = "my-app", .root_source_file = .{ .path = "src/main.zig" }, .target = target, .optimize = optimize, }); // Modern pattern (Zig 0.15.2+) const exe = b.addExecutable(.{ .name = "my-app", .root_source_file = b.path("src/main.zig"), .target = target, .optimize = optimize, }); exe.root_module.addImport("dep", dep_module); \`\`\` `.trim(); } private generateBuildZon(args: Record<string, any>): string { Logger.debug('Generating build.zig.zon file'); const _projectName = args.projectName || 'my-project'; const dependencies = Array.isArray(args.dependencies) ? args.dependencies : []; const buildZonContent = ZigBuildSystemHelper.generateBuildZon(dependencies); return ` # Generated build.zig.zon \`\`\`zig ${buildZonContent} \`\`\` ## Dependency Management Instructions: 1. **Add a new dependency:** - Add the dependency to the .dependencies section - Run \`zig build --fetch\` to download and validate 2. **Update dependency hashes:** - Zig will provide the correct hash when a mismatch is detected - Copy the hash from the error message to build.zig.zon 3. **Use dependencies in build.zig:** \`\`\`zig const my_dep = b.dependency("my_dep", .{ .target = target, .optimize = optimize, }); exe.linkLibrary(my_dep.artifact("my_dep")); \`\`\` ## Popular Zig Dependencies: ${Object.entries(ZigBuildSystemHelper.getExampleDependencies()) .map(([_key, dep]) => `- **${dep.name}**: ${dep.url}`) .join('\n')} ## Best Practices: - Keep dependencies minimal and well-maintained - Pin to specific versions or commits for reproducible builds - Regularly update dependencies for security fixes - Document why each dependency is needed `.trim(); } private generateBuildExamples(): string { const examples = [ { name: 'Basic Executable', description: 'Simple executable with modern Zig 0.15.2+ build patterns', config: { zigVersion: '0.15.2', buildMode: 'ReleaseSafe' as OptimizationLevel }, }, { name: 'Library with Dependencies', description: 'Library project with external dependencies using modern module system', config: { zigVersion: '0.15.2', buildMode: 'ReleaseSafe' as OptimizationLevel, dependencies: { args: 'https://github.com/MasterQ32/zig-args' }, }, }, { name: 'Cross-platform Application', description: 'Application configured for multiple platforms with Zig 0.15.2+ patterns', config: { zigVersion: '0.15.2', buildMode: 'ReleaseFast' as OptimizationLevel, targetTriple: 'native', }, }, ]; return examples .map( example => ` ## ${example.name} ${example.description} \`\`\`zig ${ZigBuildSystemHelper.generateBuildZig(example.config)} \`\`\` ` ) .join('\n---\n'); } async run(): Promise<void> { try { const transport = new StdioServerTransport(); await this.server.connect(transport); Logger.info('Zig MCP server running on stdio'); } catch (error) { Logger.error('Failed to start server', error as Error); process.exit(1); } } } const server = new ZigServer(); server.run().catch(console.error);

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/openSVM/zig-mcp-server'

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