Skip to main content
Glama
Hyeonu-Cha
by Hyeonu-Cha

dotnet-coverage-mcp

build tests NuGet License: MIT

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

사용 가능한 도구

도구

설명

GetSourceFiles

파일, 폴더 또는 .csproj 프로젝트에서 .cs 파일을 검색합니다. 파일 메타데이터(라인 수, 메서드 수)와 lineBudget 기준으로 그룹화된 스마트 배치를 반환합니다.

RunTestsWithCoverage

XPlat Code Coverage로 dotnet test를 실행하고 reportgenerator를 통해 JSON 요약을 생성합니다. Summary.jsoncoverage.cobertura.xml 경로를 반환합니다. 동시성 격리를 위해 forceRestoresessionId를 지원합니다.

GetCoverageSummary

Summary.json을 파싱하여 브랜치 커버리지 기준 최악 우선 정렬된 구조화된 클래스/메서드 커버리지 데이터로 변환합니다. 선택적 belowTarget/topN/methodsPerClass 필터로 아직 개선이 필요한 항목만 응답에 포함시킬 수 있습니다.

GetFileCoverage

Cobertura XML에서 단일 소스 파일의 커버리지를 가져옵니다. allMeetTarget을 반환합니다(모든 클래스가 라인 및 브랜치 커버리지 모두에 대해 구성된 targetRate(기본 0.8)를 충족하면 true). sessionId를 지원합니다.

GetUncoveredBranches

주어진 이름과 일치하는 메서드의 커버되지 않은 브랜치 조건을 찾습니다. 부분 이름 매칭을 지원하며 일치하는 모든 메서드를 반환합니다. sessionId를 지원합니다.

GetCoverageDiff

현재 Cobertura XML을 기준선(baseline)과 비교합니다. 추가 및 제거된 메서드를 포함한 메서드 수준 변경 사항을 보여줍니다. 동시성 격리를 위해 sessionId를 지원합니다.

AppendTestCode

테스트 파일에 C# 테스트 코드를 삽입하거나 추가합니다. 공백 허용 폴백 매칭을 통한 앵커 기반 삽입을 지원합니다. 파일 손상을 방지하기 위해 원자적 쓰기를 사용합니다.

CleanupSession

세션 상태 파일과 TestResults/coveragereport 디렉터리를 제거합니다. 범위를 지정하려면 sessionId를 전달하고, 생략하면 maxAgeMinutes(기본 120)보다 오래된 아티팩트를 정리합니다.

배치 워크플로

소스 파일이 많은 프로젝트의 경우 권장 워크플로는 다음과 같습니다:

  1. 검색 — 폴더 또는 .csproj에서 GetSourceFiles를 호출하여 모든 파일과 스마트 배치를 가져옵니다

  2. 1회 실행 — 광범위한 필터(예: *)로 RunTestsWithCoverage를 호출하여 모든 파일의 커버리지를 수집합니다

  3. 파일별 확인 — 현재 배치의 각 파일에 대해 GetFileCoverage를 호출합니다(즉시 XML 파싱, 테스트 재실행 없음)

  4. 집중 — 브랜치 커버리지가 가장 낮은 메서드 3개를 선택하고 각각에 대해 GetUncoveredBranches를 호출합니다

  5. 테스트 작성AppendTestCode를 사용하여 테스트 메서드를 추가합니다

  6. 재실행 및 비교 — 테스트를 한 번 실행하고 GetCoverageDiff를 호출하여 개선을 확인합니다

  7. 반복 — 배치 파일이 목표 비율(기본 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-mcp

Claude 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

매개변수

유형

필수

설명

path

string

.cs 파일, 폴더 또는 .csproj 프로젝트의 경로

lineBudget

int

아니요

배치당 최대 총 라인 수(기본값: 300). 작은 파일은 함께 그룹화되고, 큰 파일은 자체 배치를 갖습니다.

RunTestsWithCoverage

매개변수

유형

필수

설명

testProjectPath

string

.csproj 테스트 프로젝트의 전체 경로

filter

string

테스트 필터 문자열(FullyQualifiedName에 대해 일치). 여러 테스트 클래스에 걸친 광범위한 실행에는 * 또는 ,를 사용하십시오.

workingDir

string

아니요

작업 디렉터리; 기본값은 프로젝트 디렉터리

forceRestore

bool

아니요

true이면 --no-restore 플래그를 건너뜁니다. 새 테스트 프로젝트를 스캐폴딩하거나 NuGet 패키지를 추가한 후에 사용하십시오.

sessionId

string

아니요

출력 디렉터리(TestResults-{hash}/, coveragereport-{hash}/)와 상태 파일을 격리하여 동시 다중 에이전트 사용을 지원합니다.

includeClass

string

아니요

이 이름과 일치하는 유형으로 커버리지 수집을 제한합니다(cover Include 필터, 생성된 runsettings 파일을 통해 --settings로 적용). filter와 독립적입니다 — 명시적 커버리지 범위를 지정하려면 값을 전달하고, 실행이 접촉하는 모든 항목에 대해 커버리지를 수집하려면 생략하십시오. 네임스페이스 한정 이름은 지원되지 않습니다.

skipReport

bool

아니요

true이면 reportgenerator JSON 요약 단계를 건너뛰고 Cobertura XML 경로만 반환합니다. GetFileCoverage/GetUncoveredBranches/GetCoverageDiff가 XML을 직접 읽는 내부 테스트 루프에 더 빠릅니다. GetCoverageSummarySummary.json이 필요하면 false(기본값)로 두십시오.

GetCoverageSummary

매개변수

유형

필수

설명

summaryJsonPath

string

생성된 Summary.json 파일의 전체 경로

belowTarget

double

아니요

설정 시([0,1] 범위의 비율, 예: 0.8), 줄 또는 분기 커버리지가 이 임계값 미만인 클래스만 반환합니다. 모든 클래스를 보려면 생략하십시오.

topN

int

아니요

분기 커버리지가 가장 낮은 N개 클래스만 반환합니다(결과는 최저 우선으로 정렬). 모든 클래스를 보려면 생략하십시오.

methodsPerClass

int

아니요

클래스당 분기 커버리지가 가장 낮은 메서드를 최대 이 개수만 유지하고 나머지는 제거합니다. 모든 메서드를 유지하려면 생략하십시오.

GetFileCoverage

매개변수

유형

필수

설명

coberturaXmlPath

string

coverage.cobertura.xml 경로(찾을 수 없으면 .mcp-coverage/.coverage-state로 폴백)

sourceFileName

string

조회할 소스 파일 이름(예: ExampleService.cs)

sessionId

string

아니요

세션 범위 상태 파일을 해석하여 동시 격리를 지원합니다.

targetRate

double

아니요

allMeetTarget 계산에 사용되는 커버리지 임계값(0.0–1.0). 기본값 0.8.

GetUncoveredBranches

매개변수

유형

필수

설명

coberturaXmlPath

string

coverage.cobertura.xml 경로(찾을 수 없으면 .mcp-coverage/.coverage-state로 폴백)

methodName

string

검사할 메서드 이름(부분 일치 지원; 일치하는 모든 메서드 반환)

sessionId

string

아니요

세션 범위 상태 파일을 해석하여 동시 격리를 지원합니다.

GetCoverageDiff

매개변수

유형

필수

설명

coberturaXmlPath

string

현재 coverage.cobertura.xml 경로

workingDir

string

아니요

기준선 저장 디렉터리; 기본값은 XML의 부모 디렉터리

sessionId

string

아니요

기준선을 .coverage-prev-{hash}.xml로 격리하고 세션 범위 상태 파일을 해석합니다.

AppendTestCode

매개변수

유형

필수

설명

testFilePath

string

대상 .cs 테스트 파일의 전체 경로

codeToAppend

string

삽입할 C# 코드

insertAfterAnchor

string

아니요

제공 시 이 문자열의 마지막 발생 위치 뒤에 코드를 삽입합니다(공백 허용 폴백 포함). 생략하면 마지막 } 앞에 추가합니다.

CleanupSession

매개변수

유형

필수

설명

workingDir

string

.mcp-coverage/ 및 TestResults 아티팩트를 포함하는 프로젝트 작업 디렉터리

sessionId

string

아니요

설정 시 이 세션에 범위가 지정된 상태 파일과 디렉터리만 제거합니다.

maxAgeMinutes

int

아니요

sessionId가 생략되면 이 시간(분)보다 오래된 아티팩트를 제거합니다. 기본값 120.

상태 파일

모든 상태 파일은 작업 디렉터리 내부의 .mcp-coverage/ 하위 디렉터리에 기록되어 프로젝트 루트를 깨끗하게 유지합니다. 대상 저장소의 .gitignore.mcp-coverage/를 추가하십시오.

파일

용도

.coverage-state

단일 에이전트 사용을 위한 기본 Cobertura XML 경로

.coverage-state-{hash}

세션 범위 Cobertura XML 경로

.coverage-prev.xml

diff를 위한 기본 커버리지 기준선

.coverage-prev-{hash}.xml

세션 범위 커버리지 기준선

플러그인(스킬 및 에이전트)

이 저장소에는 안내된 테스트 커버리지 워크플로를 위한 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.mdreferences/integration.md에 프레임워크에 구애받지 않는 참조 문서가 있습니다.

종속성

패키지

버전

용도

Microsoft.Extensions.Hosting

10.0.7

DI 및 호스팅

ModelContextProtocol

1.2.0

MCP 서버 프레임워크

Microsoft.CodeAnalysis.CSharp

5.3.0

안전한 코드 삽입 및 정확한 메서드 계산을 위한 Roslyn AST(~15MB)

보안

dotnet-coverage-mcp는 로컬 stdio 프로세스로 실행되며 COVERAGE_MCP_ALLOWED_ROOT에 대해 모든 도구 인수를 검증하여 파일 시스템 액세스를 제한합니다. 위협 모델, 강화 권장 사항 및 취약점 신고 방법은 SECURITY.md를 참조하십시오.

기여

기여를 환영합니다. 개발 설정, 풀 리퀘스트 지침 및 코드 규칙은 CONTRIBUTING.md를 참조하십시오. 주요 변경 사항은 CHANGELOG.md에 기록됩니다.

릴리스

관리자 전용 — 릴리스 프로세스, NuGet 게시 및 MCP 레지스트리 제출은 RELEASING.md에 문서화되어 있습니다.

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
12hResponse time
5wRelease cycle
3Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…

  • MCP server for AI access to SmartBear tools, including BugSnag, Reflect, Swagger, PactFlow, QTM4J.

  • MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.

View all MCP Connectors

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/Hyeonu-Cha/dotnet-coverage-mcp'

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