dotnet-coverage-mcp
dotnet-coverage-mcp
MCP-сервер (Model Context Protocol), который предоставляет AI-ассистентам — Claude Code, Gemini CLI и другим — прямой доступ к инструментам покрытия .NET-тестов. Запускайте dotnet test, разбирайте Cobertura XML, находите непокрытые ветви, сравнивайте покрытие между запусками и добавляйте тестовый код — всё через stdio.
Назначение
Этот сервер позволяет AI-ассистенту запускать модульные тесты, собирать данные о покрытии и анализировать результаты — не выходя из чата. Вместо ручного запуска dotnet test и разбора отчётов AI может напрямую вызывать инструменты сервера, чтобы:
Находить исходные файлы и формировать умные пакеты по бюджету строк
Запускать отфильтрованный набор тестов и собирать покрытие
Читать компактные сводки покрытия, оптимизированные для AI (показатели строк и ветвей на уровне методов)
Проверять покрытие по каждому файлу относительно настраиваемой целевой нормы (по умолчанию 80%)
Выявлять непокрытые ветви в виде структурированного JSON
Сравнивать покрытие между запусками, чтобы видеть только изменения
Добавлять новый тестовый код в существующий файл тестов с атомарной записью
Related MCP server: codecov-mcp-server
Как это работает
Сервер запускается как консольный процесс и общается через stdio по протоколу MCP. MCP-совместимый клиент (Claude Code, Gemini CLI и т. д.) запускает процесс и вызывает его инструменты, как если бы это были функции.
AI Client <--stdio/MCP--> dotnet-coverage-mcp <--shell--> dotnet test + reportgeneratorДоступные инструменты
Tool | Description |
| Находит |
| Запускает |
| Разбирает |
| Получает покрытие одного исходного файла из Cobertura XML. Возвращает |
| Находит условия непокрытых ветвей для методов, соответствующих заданному имени. Возвращает все подходящие методы с поддержкой частичного совпадения имён. Поддерживает |
| Сравнивает текущий Cobertura XML с базовым. Показывает изменения на уровне методов, включая новые и удалённые методы. Поддерживает |
| Вставляет или добавляет C#-тестовый код в файл тестов. Поддерживает вставку по якорю с резервным сопоставлением, устойчивым к пробелам. Использует атомарную запись для предотвращения повреждения файла. |
| Удаляет файлы состояния сессии и каталоги |
Пакетный рабочий процесс
Для проектов с большим количеством исходных файлов рекомендуется следующий порядок действий:
Обнаружение — вызовите
GetSourceFilesдля папки или.csproj, чтобы получить все файлы и умные пакетыОдин запуск — вызовите
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для каждой сессииАтомарные записи — все файловые записи (файлы состояния и тестовый код) используют запись во временный файл с последующим переименованием, чтобы предотвратить повреждение из-за гонок или сбоев процесса
Ограничение — результаты сборки не привязаны к сессии.
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
Установка
Установите сервер как глобальный инструмент .NET из NuGet:
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Сервер запустится и будет ожидать MCP-сообщений через stdin/stdout.
Настройка 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 (Settings → Developer → Edit Config):
{
"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
Parameter | Type | Required | Description |
| string | Да | Путь к |
| int | Нет | Максимальное суммарное количество строк в пакете (по умолчанию: 300). Небольшие файлы группируются вместе; большие файлы получают собственный пакет. |
RunTestsWithCoverage
Parameter | Type | Required | Description |
| string | Yes | Полный путь к тестовому проекту |
| string | Yes | Строка фильтра тестов (сопоставляется с |
| string | No | Рабочий каталог; по умолчанию — каталог проекта |
| bool | No | Если |
| string | No | Изолирует выходные каталоги ( |
| string | No | Ограничивает сбор покрытия типами, соответствующими этому имени (фильтр coverlet |
| bool | No | Если |
GetCoverageSummary
Parameter | Type | Required | Description |
| string | Yes | Полный путь к сгенерированному файлу |
| double | No | Если задано (доля в |
| int | No | Возвращает только N классов с наименьшим покрытием ветвей (результаты отсортированы от худших к лучшим). Опустите для всех классов. |
| int | No | Оставляет не более этого количества методов с наименьшим покрытием ветвей на класс, отбрасывая остальные. Опустите, чтобы сохранить все методы. |
GetFileCoverage
Parameter | Type | Required | Description |
| string | Yes | Путь к |
| string | Yes | Имя исходного файла для поиска (например, |
| string | No | Разрешает файл состояния, привязанный к сессии, для параллельной изоляции. |
| double | No | Порог покрытия (0.0–1.0), используемый для вычисления |
GetUncoveredBranches
Parameter | Type | Required | Description |
| string | Yes | Путь к |
| string | Yes | Имя метода для проверки (поддерживается частичное совпадение; возвращаются все подходящие методы) |
| string | No | Разрешает файл состояния, привязанный к сессии, для параллельной изоляции. |
GetCoverageDiff
Parameter | Type | Required | Description |
| string | Yes | Путь к текущему |
| string | No | Каталог для хранения базовой линии; по умолчанию — родительский каталог XML |
| string | No | Изолирует базовую линию как |
AppendTestCode
Parameter | Type | Required | Description |
| string | Yes | Полный путь к целевому тестовому файлу |
| string | Yes | Код C# для вставки |
| string | No | Если указано, вставляет код после последнего вхождения этой строки (с запасным вариантом, допускающим пробелы). Если опущено, добавляет перед последней |
CleanupSession
Parameter | Type | Required | Description |
| string | Yes | Рабочий каталог проекта, содержащий |
| string | No | Если задано, удаляет только файлы состояния и каталоги, привязанные к этой сессии. |
| int | No | Если |
Файлы состояния
Все файлы состояния записываются в подкаталог .mcp-coverage/ внутри рабочего каталога, сохраняя корень проекта чистым. Добавьте .mcp-coverage/ в .gitignore целевого репозитория.
File | Purpose |
| Путь к XML Cobertura по умолчанию для использования одним агентом |
| Путь к XML Cobertura, привязанный к сессии |
| Базовая линия покрытия по умолчанию для diff |
| Базовая линия покрытия, привязанная к сессии |
Плагин (навыки и агент)
Этот репозиторий включает каталог plugin/ с навыками Claude Code и определением агента для управляемых рабочих процессов покрытия тестами:
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.
Зависимости
Package | Version | Purpose |
| 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 для настройки разработки, правил pull request и соглашений по коду. Заметные изменения отслеживаются в 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