Skip to main content
Glama
giri-jeedigunta

Test Analyzer MCP Server

check_coverage

Analyze test coverage metrics for JavaScript/TypeScript repositories to identify gaps and improve testing quality by detecting frameworks like Jest, Vitest, and Cypress.

Instructions

Check test coverage for a repository and provide detailed metrics

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
repoPathYesPath to the repository
runTestsNoWhether to run tests to generate fresh coverage data

Implementation Reference

  • Primary handler function that validates input, checks repository path, optionally runs tests or reads existing coverage, and returns CoverageResult metrics or error.
    private async checkCoverage(args: any) {
      if (!args.repoPath || typeof args.repoPath !== 'string') {
        throw new McpError(ErrorCode.InvalidParams, 'repoPath is required');
      }
    
      try {
        const repoPath = path.resolve(args.repoPath);
        
        // Check if path exists
        try {
          await fs.access(repoPath);
        } catch {
          throw new McpError(ErrorCode.InvalidParams, `Repository path does not exist: ${repoPath}`);
        }
    
        let coverageData: CoverageResult | null = null;
    
        if (args.runTests) {
          // Try to run tests with coverage
          coverageData = await this.runTestsWithCoverage(repoPath);
        } else {
          // Try to read existing coverage data
          coverageData = await this.readExistingCoverage(repoPath);
        }
    
        if (!coverageData) {
          return {
            content: [
              {
                type: 'text',
                text: 'No coverage data found. Try running with runTests: true to generate fresh coverage data.',
              },
            ],
          };
        }
    
        return {
          content: [
            {
              type: 'text',
              text: JSON.stringify(coverageData, null, 2),
            },
          ],
        };
      } catch (error) {
        if (error instanceof McpError) throw error;
        
        return {
          content: [
            {
              type: 'text',
              text: `Error checking coverage: ${error instanceof Error ? error.message : String(error)}`,
            },
          ],
          isError: true,
        };
      }
    }
  • src/index.ts:119-137 (registration)
    Tool registration in the ListTools response, defining name, description, and input schema.
    {
      name: 'check_coverage',
      description: 'Check test coverage for a repository and provide detailed metrics',
      inputSchema: {
        type: 'object',
        properties: {
          repoPath: {
            type: 'string',
            description: 'Path to the repository',
          },
          runTests: {
            type: 'boolean',
            description: 'Whether to run tests to generate fresh coverage data',
            default: false,
          },
        },
        required: ['repoPath'],
      },
    },
  • Type definition for the coverage result structure used by the tool.
    interface CoverageResult {
      lines: { percentage: number; covered: number; total: number };
      statements: { percentage: number; covered: number; total: number };
      functions: { percentage: number; covered: number; total: number };
      branches: { percentage: number; covered: number; total: number };
      summary: string;
    }
  • Dispatcher case in CallToolRequestHandler that routes to the checkCoverage method.
    case 'check_coverage':
      return await this.checkCoverage(request.params.arguments);
  • Helper function to read existing coverage data from common locations and parse into CoverageResult.
    private async readExistingCoverage(repoPath: string): Promise<CoverageResult | null> {
      // Common coverage output locations
      const coverageFiles = [
        'coverage/coverage-summary.json',
        'coverage/lcov-report/index.html',
        'coverage-final.json',
        '.nyc_output/processinfo/index.json',
      ];
      
      for (const file of coverageFiles) {
        try {
          const coveragePath = path.join(repoPath, file);
          const content = await fs.readFile(coveragePath, 'utf-8');
          
          if (file.endsWith('.json')) {
            const data = JSON.parse(content);
            
            // Parse coverage-summary.json format
            if (data.total) {
              return {
                lines: data.total.lines,
                statements: data.total.statements,
                functions: data.total.functions,
                branches: data.total.branches,
                summary: this.generateCoverageSummary(data.total),
              };
            }
          }
        } catch {
          // File doesn't exist or can't be parsed
        }
      }
      
      return null;
    }

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/giri-jeedigunta/hello-mcp'

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