dotnet-coverage-mcp
dotnet-coverage-mcp
MCP(Model Context Protocol) 서버로, Claude Code, Gemini CLI 등 AI 어시스턴트에게 .NET 테스트 커버리지 도구에 대한 직접 액세스를 제공합니다. dotnet test 실행, Cobertura XML 파싱, 커버되지 않은 브랜치 식별, 실행 간 커버리지 비교(diff), 테스트 코드 추가를 모두 stdio를 통해 수행합니다.
목적
이 서버는 AI 어시스턴트가 채팅을 벗어나지 않고도 단위 테스트를 실행하고, 커버리지 데이터를 수집하며, 결과를 분석할 수 있게 해줍니다. dotnet test를 수동으로 실행하고 보고서를 파싱하는 대신, AI가 서버의 도구를 직접 호출하여 다음을 수행할 수 있습니다:
소스 파일을 검색하고 라인 예산(line budget) 기준으로 스마트 배치 구성
필터링된 테스트 집합을 실행하고 커버리지 수집
간결하고 AI에 최적화된 커버리지 요약 읽기(메서드 수준 라인/브랜치 비율)
구성 가능한 목표 비율(기본 80%)에 대한 파일별 커버리지 확인
커버되지 않은 브랜치를 구조화된 JSON으로 식별
실행 간 커버리지 비교(diff)로 변경된 사항만 확인
기존 테스트 파일에 새 테스트 코드를 원자적 쓰기(atomic write)로 추가
Related MCP server: codecov-mcp-server
작동 방식
서버는 콘솔 프로세스로 시작되며 MCP 프로토콜을 사용해 stdio를 통해 통신합니다. MCP 호환 클라이언트(Claude Code, Gemini CLI 등)가 프로세스를 실행하고 도구를 함수처럼 호출합니다.
AI Client <--stdio/MCP--> dotnet-coverage-mcp <--shell--> dotnet test + reportgenerator사용 가능한 도구
도구 | 설명 |
| 파일, 폴더 또는 |
| XPlat Code Coverage로 |
|
|
| Cobertura XML에서 단일 소스 파일의 커버리지를 가져옵니다. |
| 주어진 이름과 일치하는 메서드의 커버되지 않은 브랜치 조건을 찾습니다. 부분 이름 매칭을 지원하며 일치하는 모든 메서드를 반환합니다. |
| 현재 Cobertura XML을 기준선(baseline)과 비교합니다. 추가 및 제거된 메서드를 포함한 메서드 수준 변경 사항을 보여줍니다. 동시성 격리를 위해 |
| 테스트 파일에 C# 테스트 코드를 삽입하거나 추가합니다. 공백 허용 폴백 매칭을 통한 앵커 기반 삽입을 지원합니다. 파일 손상을 방지하기 위해 원자적 쓰기를 사용합니다. |
| 세션 상태 파일과 |
배치 워크플로
소스 파일이 많은 프로젝트의 경우 권장 워크플로는 다음과 같습니다:
검색 — 폴더 또는
.csproj에서GetSourceFiles를 호출하여 모든 파일과 스마트 배치를 가져옵니다1회 실행 — 광범위한 필터(예:
*)로RunTestsWithCoverage를 호출하여 모든 파일의 커버리지를 수집합니다파일별 확인 — 현재 배치의 각 파일에 대해
GetFileCoverage를 호출합니다(즉시 XML 파싱, 테스트 재실행 없음)집중 — 브랜치 커버리지가 가장 낮은 메서드 3개를 선택하고 각각에 대해
GetUncoveredBranches를 호출합니다테스트 작성 —
AppendTestCode를 사용하여 테스트 메서드를 추가합니다재실행 및 비교 — 테스트를 한 번 실행하고
GetCoverageDiff를 호출하여 개선을 확인합니다반복 — 배치 파일이 목표 비율(기본 80%)을 충족하거나 개선 없이 3주기가 지날 때까지 계속한 후 다음 배치로 이동합니다
이렇게 하면 파일별 진행 상황을 추적하면서도 dotnet test 호출(주요 병목 지점)을 최소화할 수 있습니다.
동시성
여러 AI 에이전트가 각 도구 호출에 sessionId를 전달하여 병렬로 실행할 수 있으며, 이를 통해 커버리지 아티팩트가 격리됩니다:
격리된 출력 디렉터리 —
RunTestsWithCoverage는 세션별로TestResults-{hash}/및coveragereport-{hash}/를 생성하여 한 에이전트가 다른 에이전트의 XML을 파싱 중에 삭제하는 것을 방지합니다범위가 지정된 상태 파일 — 커버리지 상태는
.mcp-coverage/.coverage-state-{hash}에 기록되므로ResolveCoberturaPath가 각 세션에 대해 올바른 XML을 찾습니다범위가 지정된 기준선 —
GetCoverageDiff는 세션별로 기준선을.coverage-prev-{hash}.xml로 저장합니다원자적 쓰기 — 모든 파일 쓰기(상태 파일 및 테스트 코드)는 임시 파일에 쓴 후 이름을 바꾸는 방식(write-to-temp-then-rename)을 사용하여 경쟁 조건이나 프로세스 충돌로 인한 손상을 방지합니다
제한 사항 — 빌드 출력물은 세션 범위로 격리되지 않습니다.
sessionId는 .NET 빌드가 아닌 커버리지 아티팩트만 격리합니다.dotnet test는 대상 프로젝트를 공유obj/및bin/에 컴파일하며 이는 세션별로 구분되지 않으므로, 두 에이전트가 동시에 동일한 테스트 프로젝트에 대해RunTestsWithCoverage를 실행하면 해당 출력물에서 충돌하여buildError(예:CS2012: the file is being used by another process)로 실패합니다. 병렬 에이전트는 서로 다른 테스트 프로젝트 또는 저장소의 별도 작업 복사본에서 실행하세요. 한 프로젝트에서 여러 에이전트를 실행하는 것은dotnet test빌드가 겹치지 않는 한 문제없습니다.
sessionId가 없으면 도구는 공유 기본값을 사용합니다 — 단일 에이전트 사용에는 안전합니다.
요구 사항
.NET 9.0 SDK(이상) — https://dotnet.microsoft.com/download
reportgenerator 전역 도구 — 서버가 커버리지 보고서를 렌더링하기 위해 이 도구를 호출합니다(아래 설치 단계에서 설치)
MCP 호환 클라이언트(Claude Code, Gemini CLI 등)
COVERAGE_MCP_ALLOWED_ROOT— 권장. 저장소 루트로 설정하면 모든 도구의 파일시스템 접근이 해당 하위 트리로 제한됩니다. 클라이언트가 이 루트 밖의 경로를 전달하면pathNotAllowed로 거부됩니다. 설정하지 않으면 서버는 경고를 한 번 기록하고 모든 경로를 허용합니다(하위 호환용이지만 공유 환경에서는 권장되지 않습니다).export COVERAGE_MCP_ALLOWED_ROOT=/path/to/your/repo
설치
NuGet에서 서버를 전역 .NET 도구로 설치합니다:
dotnet tool install --global dotnet-coverage-mcp서버는 커버리지 보고서를 렌더링하기 위해 reportgenerator 전역 도구에 의존합니다 — 함께 설치하세요:
dotnet tool install --global dotnet-reportgenerator-globaltool설치 후 dotnet-coverage-mcp 명령이 PATH에 추가됩니다.
소스에서 빌드 및 실행
cd <path-to-dotnet-coverage-mcp>
# Restore dependencies
dotnet restore
# Build
dotnet build
# Run
dotnet run서버가 시작되고 stdin/stdout을 통해 MCP 메시지를 기다립니다.
MCP 클라이언트 구성
전역 도구(dotnet tool install --global dotnet-coverage-mcp)를 설치한 후,
서버를 MCP 클라이언트에 등록하세요. COVERAGE_MCP_ALLOWED_ROOT를 서버가
작동할 저장소로 설정하세요.
Claude Code
claude mcp add coverage --env COVERAGE_MCP_ALLOWED_ROOT=/path/to/your/repo -- dotnet-coverage-mcpClaude Desktop
claude_desktop_config.json에 추가합니다(설정 → 개발자 → 구성 편집):
{
"mcpServers": {
"coverage": {
"command": "dotnet-coverage-mcp",
"env": {
"COVERAGE_MCP_ALLOWED_ROOT": "/path/to/your/repo"
}
}
}
}Cursor
~/.cursor/mcp.json(전역) 또는 .cursor/mcp.json(프로젝트별)에 추가합니다:
{
"mcpServers": {
"coverage": {
"command": "dotnet-coverage-mcp",
"env": {
"COVERAGE_MCP_ALLOWED_ROOT": "/path/to/your/repo"
}
}
}
}VS Code (GitHub Copilot)
.vscode/mcp.json에 추가합니다:
{
"servers": {
"coverage": {
"type": "stdio",
"command": "dotnet-coverage-mcp",
"env": {
"COVERAGE_MCP_ALLOWED_ROOT": "/path/to/your/repo"
}
}
}
}소스에서 실행
전역 도구 대신 소스에서 실행하려면 dotnet run을 사용하세요:
{
"mcpServers": {
"coverage": {
"command": "dotnet",
"args": ["run", "--project", "<path-to-dotnet-coverage-mcp>"],
"transport": "stdio"
}
}
}또는 컴파일된 실행 파일을 직접 지정하세요:
{
"mcpServers": {
"coverage": {
"command": "<path-to-dotnet-coverage-mcp>\\bin\\Debug\\net9.0\\DotNetCoverageMcp.exe",
"transport": "stdio"
}
}
}도구 매개변수
GetSourceFiles
매개변수 | 유형 | 필수 | 설명 |
| string | 예 |
|
| int | 아니요 | 배치당 최대 총 라인 수(기본값: 300). 작은 파일은 함께 그룹화되고, 큰 파일은 자체 배치를 갖습니다. |
RunTestsWithCoverage
매개변수 | 유형 | 필수 | 설명 |
| string | 예 |
|
| string | 예 | 테스트 필터 문자열( |
| string | 아니요 | 작업 디렉터리; 기본값은 프로젝트 디렉터리 |
| bool | 아니요 |
|
| string | 아니요 | 출력 디렉터리( |
| string | 아니요 | 이 이름과 일치하는 유형으로 커버리지 수집을 제한합니다(cover |
| bool | 아니요 |
|
GetCoverageSummary
매개변수 | 유형 | 필수 | 설명 |
| string | 예 | 생성된 |
| double | 아니요 | 설정 시( |
| int | 아니요 | 분기 커버리지가 가장 낮은 N개 클래스만 반환합니다(결과는 최저 우선으로 정렬). 모든 클래스를 보려면 생략하십시오. |
| int | 아니요 | 클래스당 분기 커버리지가 가장 낮은 메서드를 최대 이 개수만 유지하고 나머지는 제거합니다. 모든 메서드를 유지하려면 생략하십시오. |
GetFileCoverage
매개변수 | 유형 | 필수 | 설명 |
| string | 예 |
|
| string | 예 | 조회할 소스 파일 이름(예: |
| string | 아니요 | 세션 범위 상태 파일을 해석하여 동시 격리를 지원합니다. |
| double | 아니요 |
|
GetUncoveredBranches
매개변수 | 유형 | 필수 | 설명 |
| string | 예 |
|
| string | 예 | 검사할 메서드 이름(부분 일치 지원; 일치하는 모든 메서드 반환) |
| string | 아니요 | 세션 범위 상태 파일을 해석하여 동시 격리를 지원합니다. |
GetCoverageDiff
매개변수 | 유형 | 필수 | 설명 |
| string | 예 | 현재 |
| string | 아니요 | 기준선 저장 디렉터리; 기본값은 XML의 부모 디렉터리 |
| string | 아니요 | 기준선을 |
AppendTestCode
매개변수 | 유형 | 필수 | 설명 |
| string | 예 | 대상 |
| string | 예 | 삽입할 C# 코드 |
| string | 아니요 | 제공 시 이 문자열의 마지막 발생 위치 뒤에 코드를 삽입합니다(공백 허용 폴백 포함). 생략하면 마지막 |
CleanupSession
매개변수 | 유형 | 필수 | 설명 |
| string | 예 |
|
| string | 아니요 | 설정 시 이 세션에 범위가 지정된 상태 파일과 디렉터리만 제거합니다. |
| int | 아니요 |
|
상태 파일
모든 상태 파일은 작업 디렉터리 내부의 .mcp-coverage/ 하위 디렉터리에 기록되어 프로젝트 루트를 깨끗하게 유지합니다. 대상 저장소의 .gitignore에 .mcp-coverage/를 추가하십시오.
파일 | 용도 |
| 단일 에이전트 사용을 위한 기본 Cobertura XML 경로 |
| 세션 범위 Cobertura XML 경로 |
| diff를 위한 기본 커버리지 기준선 |
| 세션 범위 커버리지 기준선 |
플러그인(스킬 및 에이전트)
이 저장소에는 안내된 테스트 커버리지 워크플로를 위한 Claude Code 스킬과 에이전트 정의가 포함된 plugin/ 디렉터리가 있습니다:
plugin/
├── plugin.json
├── agents/
│ └── test-coverage.agent.md
└── skills/
├── scaffold-test-files/ — Create test directories and files mirroring source structure
├── run-coverage/ — Run tests and view coverage reports
├── analyze-coverage-gaps/ — Find uncovered branches and compare diffs
└── improve-test-coverage/ — Iterative loop to reach 80% coverage스킬은 NUnit, xUnit, MSTest를 지원하며 references/unit.md 및 references/integration.md에 프레임워크에 구애받지 않는 참조 문서가 있습니다.
종속성
패키지 | 버전 | 용도 |
| 10.0.7 | DI 및 호스팅 |
| 1.2.0 | MCP 서버 프레임워크 |
| 5.3.0 | 안전한 코드 삽입 및 정확한 메서드 계산을 위한 Roslyn AST(~15MB) |
보안
dotnet-coverage-mcp는 로컬 stdio 프로세스로 실행되며 COVERAGE_MCP_ALLOWED_ROOT에 대해 모든 도구 인수를 검증하여 파일 시스템 액세스를 제한합니다. 위협 모델, 강화 권장 사항 및 취약점 신고 방법은 SECURITY.md를 참조하십시오.
기여
기여를 환영합니다. 개발 설정, 풀 리퀘스트 지침 및 코드 규칙은 CONTRIBUTING.md를 참조하십시오. 주요 변경 사항은 CHANGELOG.md에 기록됩니다.
릴리스
관리자 전용 — 릴리스 프로세스, NuGet 게시 및 MCP 레지스트리 제출은 RELEASING.md에 문서화되어 있습니다.
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for building and testing AI agents with multi-model experimentation and insights.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that enables AI agents to debug .NET applications using netcoredbg. It supports core debugging tasks like setting breakpoints, stepping through code, and inspecting variables or stack traces.1MIT
- AlicenseAqualityFmaintenanceMCP server for Codecov that provides tools to get commit coverage totals and prompts to suggest tests to write.177 npm6ISC
- AlicenseAqualityCmaintenanceAn MCP server that exposes 41 Azure DevOps tools to AI assistants, enabling management of pipelines, repositories, pull requests, releases, work items, test management, and wikis through natural language.41MIT
- AlicenseAqualityAmaintenanceAn MCP server that brings senior-QA discipline to AI coding assistants, enabling test planning, TDD, mutation testing, and code review.501,963 PyPI7Apache 2.0