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

dotnet-coverage-mcp

build tests NuGet License: MIT

Claude Code、Gemini CLI などのAIアシスタントに .NET のテストカバレッジツールへの直接アクセスを提供する MCP (Model Context Protocol) サーバーです。dotnet test の実行、Cobertura XML の解析、未カバーのブランチの特定、実行間のカバレッジ差分、テストコードの追加を、すべて stdio 経由で行えます。

目的

このサーバーにより、AIアシスタントはチャットから離れることなく、単体テストの実行、カバレッジデータの収集、結果の分析を行うことができます。dotnet test を手動で実行してレポートを解析する代わりに、AI はサーバーのツールを直接呼び出して次のことができます:

  • ソースファイルを発見し、行数予算に基づいてスマートなバッチを作成

  • フィルタリングされたテストセットを実行してカバレッジを収集

  • コンパクトで AI 向けに最適化されたカバレッジサマリーを読み取る(メソッドレベルの行/ブランチ率)

  • 設定可能な目標率(デフォルト 80%)に対するファイルごとのカバレッジを確認

  • 未カバーのブランチを構造化 JSON として特定

  • 実行間のカバレッジ差分を確認し、変更された部分だけを把握

  • 既存のテストファイルに新しいテストコードをアトミック書き込みで追加

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 から単一のソースファイルのカバレッジを取得します。すべてのクラスが設定された targetRate(行とブランチの両方のカバレッジでデフォルト 0.8)を満たしている場合に allMeetTarget を返します。sessionId をサポートします。

GetUncoveredBranches

指定された名前と一致するメソッドの未カバーのブランチ条件を検出します。部分名の一致をサポートし、一致するすべてのメソッドを返します。sessionId をサポートします。

GetCoverageDiff

現在の Cobertura XML をベースラインと比較します。新規追加・削除されたメソッドを含むメソッドレベルの変更を示します。並行実行の分離のための sessionId をサポートします。

AppendTestCode

C# テストコードをテストファイルに挿入または追加します。空白の差異を許容するフォールバックマッチングによるアンカーベースの挿入をサポートします。ファイル破損を防ぐためにアトミック書き込みを使用します。

CleanupSession

セッション状態ファイルと TestResults/coveragereport ディレクトリを削除します。sessionId を渡すとスコープを限定し、省略すると maxAgeMinutes(デフォルト 120)より古いアーティファクトをクリーンアップします。

バッチワークフロー

ソースファイルが多いプロジェクトでは、次のワークフローが推奨されます:

  1. 発見 — フォルダまたは .csproj に対して GetSourceFiles を呼び出し、すべてのファイルとスマートバッチを取得

  2. 一度実行 — 広いフィルター(例: *)で 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 として保存します

  • アトミック書き込み — すべてのファイル書き込み(状態ファイルとテストコード)は、一時ファイルへの書き込み後にリネームする方式を使用し、競合状態やプロセスクラッシュによる破損を防ぎます

制限 — ビルド出力はセッションスコープではありません。 sessionId はカバレッジアーティファクトを分離しますが、.NET ビルドは分離しません。dotnet test は対象プロジェクトを共有の obj/bin/ にコンパイルしますが、これらはセッションごとではないため、同じテストプロジェクトに対して同時に RunTestsWithCoverage を実行する2つのエージェントは、それらの出力で衝突し、buildError(例: CS2012: the file is being used by another process)で失敗します。並行エージェントは異なるテストプロジェクトに対して実行するか、リポジトリの別々の作業コピーで実行してください。1つのプロジェクトで複数のエージェントを実行する場合も、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

Parameter

Type

Required

Description

testProjectPath

string

Yes

.csproj テストプロジェクトへのフルパス

filter

string

Yes

テストフィルター文字列(FullyQualifiedName に対して照合)。複数のテストクラスにわたる広範な実行には * または , を使用。

workingDir

string

No

作業ディレクトリ。デフォルトはプロジェクトディレクトリ

forceRestore

bool

No

true の場合、--no-restore フラグをスキップ。新しいテストプロジェクトのスキャフォールディング後や NuGet パッケージ追加後に使用。

sessionId

string

No

出力ディレクトリ(TestResults-{hash}/coveragereport-{hash}/)と状態ファイルを分離し、並行マルチエージェント使用に対応。

includeClass

string

No

この名前と一致する型にカバレッジ収集を制限(coverlet の Include フィルター。生成された runsettings ファイルを --settings で渡して適用)。filter とは独立 — 明示的な値を渡してカバレッジをスコープし、省略すると実行が触れるすべてのもののカバレッジを収集。名前空間修飾名はサポートされていません。

skipReport

bool

No

true の場合、reportgenerator の JSON サマリー手順をスキップし、Cobertura XML パスのみを返します。GetFileCoverage/GetUncoveredBranches/GetCoverageDiff が XML を直接読み取る内側のテストループでは高速です。GetCoverageSummarySummary.json が必要な場合は false(デフォルト)のままにします。

GetCoverageSummary

Parameter

Type

Required

Description

summaryJsonPath

string

Yes

生成された Summary.json ファイルへのフルパス

belowTarget

double

No

設定時([0,1] の小数、例: 0.8)、行またはブランチのカバレッジがこのしきい値を下回るクラスのみを返します。省略すると全クラスを返します。

topN

int

No

ブランチカバレッジが最も低い N 個のクラスのみを返します(結果は悪い順にソート)。省略すると全クラスを返します。

methodsPerClass

int

No

クラスごとにブランチカバレッジが最も低いメソッドを最大この数だけ保持し、残りを削除します。省略すると全メソッドを保持します。

GetFileCoverage

Parameter

Type

Required

Description

coberturaXmlPath

string

Yes

coverage.cobertura.xml へのパス(見つからない場合は .mcp-coverage/.coverage-state にフォールバック)

sourceFileName

string

Yes

検索するソースファイル名(例: ExampleService.cs

sessionId

string

No

並行分離のためのセッションスコープの状態ファイルを解決します。

targetRate

double

No

allMeetTarget の計算に使用するカバレッジしきい値(0.0–1.0)。デフォルトは 0.8

GetUncoveredBranches

Parameter

Type

Required

Description

coberturaXmlPath

string

Yes

coverage.cobertura.xml へのパス(見つからない場合は .mcp-coverage/.coverage-state にフォールバック)

methodName

string

Yes

検査するメソッド名(部分一致をサポート。一致するすべてのメソッドを返します)

sessionId

string

No

並行分離のためのセッションスコープの状態ファイルを解決します。

GetCoverageDiff

Parameter

Type

Required

Description

coberturaXmlPath

string

Yes

現在の coverage.cobertura.xml へのパス

workingDir

string

No

ベースラインを保存するディレクトリ。デフォルトは XML の親ディレクトリ

sessionId

string

No

ベースラインを .coverage-prev-{hash}.xml として分離し、セッションスコープの状態ファイルを解決します。

AppendTestCode

Parameter

Type

Required

Description

testFilePath

string

Yes

対象の .cs テストファイルへのフルパス

codeToAppend

string

Yes

挿入する C# コード

insertAfterAnchor

string

No

指定した場合、この文字列の最後の出現箇所の後にコードを挿入します(空白を許容するフォールバック付き)。省略した場合、最後の } の前に追加します。

CleanupSession

Parameter

Type

Required

Description

workingDir

string

Yes

.mcp-coverage/ と TestResults アーティファクトを含むプロジェクト作業ディレクトリ

sessionId

string

No

設定時、このセッションにスコープされた状態ファイルとディレクトリのみを削除します。

maxAgeMinutes

int

No

sessionId が省略された場合、この分数より古いアーティファクトを削除します。デフォルトは 120

状態ファイル

すべての状態ファイルは作業ディレクトリ内の .mcp-coverage/ サブディレクトリに書き込まれ、プロジェクトルートをクリーンに保ちます。ターゲットリポジトリの .gitignore.mcp-coverage/ を追加してください。

File

Purpose

.coverage-state

シングルエージェント使用時のデフォルトの Cobertura XML パス

.coverage-state-{hash}

セッションスコープの Cobertura XML パス

.coverage-prev.xml

差分用のデフォルトのカバレッジベースライン

.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 にフレームワーク非依存のリファレンスドキュメントがあります。

依存関係

Package

Version

Purpose

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