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 installed
Maintenance
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
- 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.1736ISC
- 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.486Apache 2.0
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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