npm package: @iflow-mcp/goldbergyoni-test-coverage-mcp
Description: MCP server for analyzing test coverage from LCOV files - makes AI coding agents coverage-aware without wasting tokens
Author: Yoni Goldberg
Latest version: 1.1.4

# Test Coverage MCP

[![npm version](https://badge.fury.io/js/test-coverage-mcp.svg)](https://www.npmjs.com/package/test-coverage-mcp)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
![Coverage](https://img.shields.io/badge/coverage-95%25-brightgreen)
![CI](https://github.com/goldbergyoni/test-coverage-mcp/actions/workflows/test.yml/badge.svg)
![Last Commit](https://img.shields.io/github/last-commit/goldbergyoni/test-coverage-mcp)

**Make your agents coverage-aware as they code for you**

> “Hey, I’m a coding agent. I just created flashy nifty feature… but oops, I downgraded the coverage 🤓. How could I know that?”

> “Hey, I’m a testing agent. I was tasked to cover some code with testing, but how can I find which areas are not covered?😳”

Give your coding and testing agent eyes: MCP server that provides instant, reliable, token-efficient test coverage data for any programming language (LCOV based)

__

> 🚀 Just launched (November 2025) ! I spend great time these days on polishing this library. If you find this valuable, a ⭐ star helps signal to other developers that this project is worth their attention

## The Problem

When AI coding agents work on your code without proper coverage tooling, they face three critical issues:

1. **Coverage Blindness** - They can't see if their changes improved or regressed test coverage
2. **Token Waste** - They burn thousands of tokens trying to parse massive LCOV files (some exceed 10 MB)
3. **Unreliable Scripts** - They improvise custom parsing scripts that often fail or produce incorrect results

## The Solution

This MCP server solves all three problems by providing:

- **Coverage Awareness** - Agents can check coverage anytime with a simple tool call
- **Token Efficiency** - Get coverage summaries in <100 tokens instead of thousands
- **Accuracy** - Production-grade LCOV parsing that handles all format variations
- **Baseline Tracking** - Measure coverage progress within a session without keeping state in memory

**Test Coverage**: This project maintains 95% test coverage and we're targeting 100% soon.

## Two Main Workflows

### 1. Query Coverage Summary

Ask for overall project coverage or coverage for specific files:

```typescript
// Get overall project coverage
coverage_summary({ lcovPath: "./coverage/lcov.info" });
// Returns: { linesCoveragePercentage: 87.5, branchesCoveragePercentage: 82.1 }

// Get coverage for specific files
coverage_file_summary({
  lcovPath: "./coverage/lcov.info",
  filePath: "src/utils/parser.ts",
});
// Returns: { path: "src/utils/parser.ts", linesCoveragePercentage: 92.0, branchesCoveragePercentage: 88.5 }
```

### 2. Baseline Tracking for Session Progress

Establish a baseline at session start, then measure your progress:

```typescript
// At session start - record current coverage as baseline
start_recording({ lcovPath: "./coverage/lcov.info" });
// Returns: "Recording started"

// ... agent writes code and tests ...

// Check coverage impact
get_diff_since_start({ lcovPath: "./coverage/lcov.info" });
// Returns: { linesPercentageImpact: +2.3, branchesPercentageImpact: +1.8 }
```

**Why baseline tracking?** Without it, agents would need to keep initial coverage in their stateful memory throughout the session, consuming valuable context window space.

## Installation

```bash
npm install -g test-coverage-mcp
```

## Configuration

Add this MCP server to your AI coding tool's configuration:

### Claude Desktop (Claude Code)

**macOS**: Edit `~/Library/Application Support/Claude/claude_desktop_config.json`
**Windows**: Edit `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "test-coverage": {
      "command": "npx",
      "args": ["-y", "test-coverage-mcp"]
    }
  }
}
```

After updating, restart Claude Desktop.

### Cursor IDE

Create or edit `.cursor/mcp.json` in your project root:

```json
{
  "mcpServers": {
    "test-coverage": {
      "command": "npx",
      "args": ["-y", "test-coverage-mcp"]
    }
  }
}
```

### GitHub Copilot (VS Code)

Create or edit `.vscode/mcp.json` in your workspace:

```json
{
  "servers": {
    "test-coverage": {
      "command": "npx",
      "args": ["-y", "test-coverage-mcp"]
    }
  }
}
```

Requires VS Code 1.99+ or Visual Studio 17.14+. Enterprise users need "MCP servers in Copilot" policy enabled.

### Windsurf (Codeium IDE)

**macOS**: Edit `~/.codeium/windsurf/mcp_config.json`
**Windows**: Edit `%APPDATA%\Codeium\Windsurf\mcp_config.json`
**Linux**: Edit `~/.codeium/windsurf/mcp_config.json`

```json
{
  "mcpServers": {
    "test-coverage": {
      "command": "npx",
      "args": ["-y", "test-coverage-mcp"]
    }
  }
}
```

Or use the GUI: Settings → Advanced Settings → Cascade → Add Server

## Available Tools

### `coverage_summary`

Get overall project coverage from an LCOV file.

**Input:**

```typescript
{
  lcovPath?: string  // Optional. Defaults to "./coverage/lcov.info"
}
```

**Output:**

```typescript
{
  linesCoveragePercentage: number,      // 0-100
  branchesCoveragePercentage: number    // 0-100
}
```

**Example:**

```typescript
coverage_summary({ lcovPath: "./coverage/lcov.info" });
// { linesCoveragePercentage: 87.5, branchesCoveragePercentage: 82.1 }
```

### `coverage_file_summary`

Get coverage for a specific file.

**Input:**

```typescript
{
  lcovPath?: string,  // Optional. Defaults to "./coverage/lcov.info"
  filePath: string    // Required. Path to the file
}
```

**Output:**

```typescript
{
  path: string,
  linesCoveragePercentage: number,      // 0-100
  branchesCoveragePercentage: number    // 0-100
}
```

**Example:**

```typescript
coverage_file_summary({
  lcovPath: "./coverage/lcov.info",
  filePath: "src/utils/parser.ts",
});
// { path: "src/utils/parser.ts", linesCoveragePercentage: 92.0, branchesCoveragePercentage: 88.5 }
```

### `start_recording`

Record current coverage as a baseline for later comparison.

**Input:**

```typescript
{
  lcovPath: string; // Required. Path to LCOV file to record
}
```

**Output:**

```typescript
"Recording started";
```

**Example:**

```typescript
start_recording({ lcovPath: "./coverage/lcov.info" });
// "Recording started"
```

### `get_diff_since_start`

Compare current coverage against the recorded baseline.

**Input:**

```typescript
{
  lcovPath: string; // Required. Path to current LCOV file
}
```

**Output:**

```typescript
{
  linesPercentageImpact: number,      // Positive = improvement, negative = regression
  branchesPercentageImpact: number    // Positive = improvement, negative = regression
}
```

**Example:**

```typescript
get_diff_since_start({ lcovPath: "./coverage/lcov.info" });
// { linesPercentageImpact: +2.3, branchesPercentageImpact: +1.8 }
```

## Usage Examples

### Example 1: Check Coverage Before Starting Work

```
Agent: "Let me check the current test coverage before I start working"
[Uses coverage_summary tool]
Agent: "Current coverage is 87.5% lines and 82.1% branches. I'll aim to maintain or improve this."
```

### Example 2: Track Coverage Impact During Development

```
Agent: "I'll record the baseline coverage first"
[Uses start_recording tool]

Agent: "Now I'll add the new authentication feature with tests"
[Writes code and tests]

Agent: "Let me check the coverage impact"
[Uses get_diff_since_start tool]
Agent: "Great! Coverage increased by 2.3% for lines and 1.8% for branches."
```

### Example 3: Verify Specific File Coverage

```
Agent: "Let me check coverage for the file I just modified"
[Uses coverage_file_summary with filePath: "src/auth/validator.ts"]
Agent: "The validator.ts file now has 95% line coverage and 92% branch coverage."
```

## How It Works

This MCP server:

1. **Parses LCOV files** using a production-grade parser that handles all LCOV format variations
2. **Calculates coverage** percentages for overall project or individual files
3. **Stores baselines** in a temporary directory for session-based tracking
4. **Returns compact JSON** responses that consume minimal tokens

## LCOV Format Support

This server supports all standard LCOV file formats, including:

- Files with summary sections (`SF:`, `end_of_record`)
- Files with line-by-line data only (`DA:` entries)
- Files with branch coverage data (`BRDA:`, `BRF:`, `BRH:`)
- Mixed formats within the same file

## Troubleshooting

### "LCOV file not found"

- Ensure you've run your test suite with coverage enabled first
- Check that the path to your LCOV file is correct (relative paths are resolved from current working directory)
- Default path is `./coverage/lcov.info`

### "No coverage data found for file"

- Verify the file path matches exactly as it appears in the LCOV file
- Some test frameworks use absolute paths, others use relative paths

### "No baseline recording found"

- You must call `start_recording` before calling `get_diff_since_start`
- Baselines are stored in temporary storage and cleared when the system restarts

## Development

```bash
# Install dependencies
npm install

# Build
npm run build

# Run tests (with coverage!)
npm test

# Run linter
npm run lint

# Test with MCP inspector
npm run inspect
```

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

## License

MIT © Yoni Goldberg

## Links

- [GitHub Repository](https://github.com/goldbergyoni/test-coverage-mcp)
- [npm Package](https://www.npmjs.com/package/test-coverage-mcp)
- [MCP Documentation](https://modelcontextprotocol.io)
- [Report Issues](https://github.com/goldbergyoni/test-coverage-mcp/issues)

## Improvement ideas

- coverage_file_summary returns nested properties also declared as flat
- Start recording overrides other sessions files
- Improve record naming - setSessionBaseline, getDiffSinceBaseline
-