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

dotnet-coverage-mcp

build tests NuGet License: MIT

Un servidor MCP (Model Context Protocol) que brinda a los asistentes de IA — Claude Code, Gemini CLI y otros — acceso directo a las herramientas de cobertura de pruebas de .NET. Ejecuta dotnet test, analiza XML de Cobertura, identifica ramas no cubiertas, compara la cobertura entre ejecuciones y añade código de prueba, todo a través de stdio.

Propósito

Este servidor permite que un asistente de IA ejecute pruebas unitarias, recopile datos de cobertura y analice resultados, todo sin salir del chat. En lugar de ejecutar manualmente dotnet test y analizar informes, la IA puede llamar directamente a las herramientas del servidor para:

  • Descubrir archivos fuente y crear lotes inteligentes según el presupuesto de líneas

  • Ejecutar un conjunto filtrado de pruebas y recopilar cobertura

  • Leer resúmenes de cobertura compactos y optimizados para IA (tasas de línea/rama a nivel de método)

  • Verificar la cobertura por archivo contra una tasa objetivo configurable (80% por defecto)

  • Identificar ramas no cubiertas como JSON estructurado

  • Comparar la cobertura entre ejecuciones para ver solo lo que cambió

  • Añadir nuevo código de prueba a un archivo de prueba existente con escrituras atómicas

Related MCP server: codecov-mcp-server

Cómo funciona

El servidor se inicia como un proceso de consola y se comunica a través de stdio usando el protocolo MCP. Un cliente compatible con MCP (Claude Code, Gemini CLI, etc.) lanza el proceso y llama a sus herramientas como si fueran funciones.

AI Client  <--stdio/MCP-->  dotnet-coverage-mcp  <--shell-->  dotnet test + reportgenerator

Herramientas disponibles

Herramienta

Descripción

GetSourceFiles

Descubre archivos .cs de un archivo, carpeta o proyecto .csproj. Devuelve metadatos de archivos (líneas, número de métodos) y lotes inteligentes agrupados por lineBudget.

RunTestsWithCoverage

Ejecuta dotnet test con XPlat Code Coverage, genera un resumen JSON mediante reportgenerator. Devuelve rutas a Summary.json y coverage.cobertura.xml. Admite forceRestore y sessionId para aislamiento concurrente.

GetCoverageSummary

Analiza Summary.json en datos estructurados de cobertura de clases/métodos ordenados de peor a mejor por cobertura de ramas. Los filtros opcionales belowTarget/topN/methodsPerClass reducen la respuesta a lo que aún necesita trabajo.

GetFileCoverage

Obtiene la cobertura de un único archivo fuente desde XML de Cobertura. Devuelve allMeetTarget (true cuando todas las clases cumplen la targetRate configurada tanto para cobertura de líneas como de ramas; por defecto 0.8). Admite sessionId.

GetUncoveredBranches

Encuentra condiciones de rama no cubiertas para métodos que coinciden con un nombre dado. Devuelve todos los métodos coincidentes con soporte de nombre parcial. Admite sessionId.

GetCoverageDiff

Compara el XML de Cobertura actual contra la línea base. Muestra cambios a nivel de método, incluidos métodos nuevos y eliminados. Admite sessionId para aislamiento concurrente.

AppendTestCode

Inserta o añade código de prueba C# en un archivo de prueba. Admite inserción basada en anclas con coincidencia de respaldo tolerante a espacios en blanco. Usa escrituras atómicas para evitar la corrupción de archivos.

CleanupSession

Elimina archivos de estado de sesión y directorios TestResults/coveragereport. Pasa sessionId para acotar, u omítelo para limpiar artefactos más antiguos que maxAgeMinutes (por defecto 120).

Flujo de trabajo por lotes

Para proyectos con muchos archivos fuente, el flujo de trabajo recomendado es:

  1. Descubrir — Llama a GetSourceFiles en una carpeta o .csproj para obtener todos los archivos y lotes inteligentes

  2. Ejecutar una vez — Llama a RunTestsWithCoverage con un filtro amplio (p. ej., *) para recopilar cobertura en todos los archivos

  3. Verificar por archivo — Llama a GetFileCoverage para cada archivo del lote actual (análisis XML instantáneo, sin re-ejecutar pruebas)

  4. Enfocar — Elige los 3 métodos con menor cobertura de ramas y llama a GetUncoveredBranches para cada uno

  5. Escribir pruebas — Usa AppendTestCode para añadir métodos de prueba

  6. Re-ejecutar y comparar — Ejecuta las pruebas una vez, llama a GetCoverageDiff para verificar la mejora

  7. Repetir — Continúa hasta que los archivos del lote cumplan la tasa objetivo (80% por defecto) o 3 ciclos sin mejora, luego pasa al siguiente lote

Esto minimiza las invocaciones de dotnet test (el principal cuello de botella) mientras sigue el progreso por archivo.

Concurrencia

Varios agentes de IA pueden ejecutarse en paralelo pasando un sessionId a cada llamada de herramienta, lo que aísla sus artefactos de cobertura:

  • Directorios de salida aisladosRunTestsWithCoverage crea TestResults-{hash}/ y coveragereport-{hash}/ por sesión, evitando que un agente elimine el XML de otro durante el análisis

  • Archivos de estado acotados — El estado de cobertura se escribe en .mcp-coverage/.coverage-state-{hash}, por lo que ResolveCoberturaPath resuelve el XML correcto para cada sesión

  • Líneas base acotadasGetCoverageDiff almacena líneas base como .coverage-prev-{hash}.xml por sesión

  • Escrituras atómicas — Todas las escrituras de archivos (archivos de estado y código de prueba) usan escribir-a-temporal-luego-renombrar para evitar la corrupción por condiciones de carrera o fallos del proceso

Limitación: los resultados de compilación no están acotados por sesión. sessionId aísla los artefactos de cobertura, no la compilación de .NET. dotnet test compila el proyecto de destino en sus obj/ y bin/ compartidos, que no son por sesión, por lo que dos agentes que ejecutan RunTestsWithCoverage contra el mismo proyecto de prueba al mismo tiempo chocan en esos resultados y fallan con buildError (p. ej., CS2012: el archivo está siendo usado por otro proceso). Ejecuta agentes en paralelo contra proyectos de prueba diferentes, o en copias de trabajo separadas del repositorio. Varios agentes en un solo proyecto están bien siempre que sus compilaciones de dotnet test no se superpongan.

Sin sessionId, las herramientas usan valores predeterminados compartidos: seguro para uso de un solo agente.

Requisitos

  • .NET 9.0 SDK (o posterior)https://dotnet.microsoft.com/download

  • Herramienta global reportgenerator — el servidor la invoca para renderizar informes de cobertura (instalada en el paso Instalación a continuación)

  • Un cliente compatible con MCP (Claude Code, Gemini CLI, etc.)

  • COVERAGE_MCP_ALLOWED_ROOT — recomendado. Establécelo en la raíz de tu repositorio para restringir el acceso al sistema de archivos de cada herramienta a ese subárbol. Cualquier ruta pasada por el cliente fuera de esta raíz se rechaza con pathNotAllowed. Si no se establece, el servidor registra una advertencia una vez y acepta cualquier ruta (compatible con versiones anteriores, pero no recomendado para entornos compartidos).

    export COVERAGE_MCP_ALLOWED_ROOT=/path/to/your/repo

Instalación

Instala el servidor como una herramienta global de .NET desde NuGet:

dotnet tool install --global dotnet-coverage-mcp

El servidor depende de la herramienta global reportgenerator para renderizar informes de cobertura: instálala también:

dotnet tool install --global dotnet-reportgenerator-globaltool

Después de la instalación, el comando dotnet-coverage-mcp está en tu PATH.

Compilar y ejecutar (desde el código fuente)

cd <path-to-dotnet-coverage-mcp>

# Restore dependencies
dotnet restore

# Build
dotnet build

# Run
dotnet run

El servidor se iniciará y esperará mensajes MCP a través de stdin/stdout.

Configuración del cliente MCP

Después de instalar la herramienta global (dotnet tool install --global dotnet-coverage-mcp), registra el servidor con tu cliente MCP. Establece COVERAGE_MCP_ALLOWED_ROOT al repositorio en el que quieres que opere el servidor.

Claude Code

claude mcp add coverage --env COVERAGE_MCP_ALLOWED_ROOT=/path/to/your/repo -- dotnet-coverage-mcp

Claude Desktop

Añade a claude_desktop_config.json (Configuración → Desarrollador → Editar configuración):

{
  "mcpServers": {
    "coverage": {
      "command": "dotnet-coverage-mcp",
      "env": {
        "COVERAGE_MCP_ALLOWED_ROOT": "/path/to/your/repo"
      }
    }
  }
}

Cursor

Añade a ~/.cursor/mcp.json (global) o .cursor/mcp.json (por proyecto):

{
  "mcpServers": {
    "coverage": {
      "command": "dotnet-coverage-mcp",
      "env": {
        "COVERAGE_MCP_ALLOWED_ROOT": "/path/to/your/repo"
      }
    }
  }
}

VS Code (GitHub Copilot)

Añade a .vscode/mcp.json:

{
  "servers": {
    "coverage": {
      "type": "stdio",
      "command": "dotnet-coverage-mcp",
      "env": {
        "COVERAGE_MCP_ALLOWED_ROOT": "/path/to/your/repo"
      }
    }
  }
}

Ejecutar desde el código fuente

Para ejecutar desde el código fuente en lugar de la herramienta global, usa dotnet run:

{
  "mcpServers": {
    "coverage": {
      "command": "dotnet",
      "args": ["run", "--project", "<path-to-dotnet-coverage-mcp>"],
      "transport": "stdio"
    }
  }
}

O apunta directamente al ejecutable compilado:

{
  "mcpServers": {
    "coverage": {
      "command": "<path-to-dotnet-coverage-mcp>\\bin\\Debug\\net9.0\\DotNetCoverageMcp.exe",
      "transport": "stdio"
    }
  }
}

Parámetros de las herramientas

GetSourceFiles

Parámetro

Tipo

Obligatorio

Descripción

path

string

Ruta a un archivo .cs, carpeta o proyecto .csproj

lineBudget

int

No

Máximo total de líneas por lote (por defecto: 300). Los archivos pequeños se agrupan; los grandes tienen su propio lote.

RunTestsWithCoverage

Parámetro

Tipo

Obligatorio

Descripción

testProjectPath

string

Ruta completa al proyecto de prueba .csproj

filter

string

Cadena de filtro de prueba (se compara con FullyQualifiedName). Use * o , para ejecuciones amplias en varias clases de prueba.

workingDir

string

No

Directorio de trabajo; por defecto, el directorio del proyecto

forceRestore

bool

No

Cuando es true, omite la bandera --no-restore. Úselo después de crear un nuevo proyecto de prueba o agregar paquetes NuGet.

sessionId

string

No

Aísla los directorios de salida (TestResults-{hash}/, coveragereport-{hash}/) y los archivos de estado para uso concurrente de múltiples agentes.

includeClass

string

No

Restringe la recopilación de cobertura a los tipos que coincidan con este nombre (filtro Include de coverlet, aplicado mediante un archivo runsettings generado y pasado con --settings). Independiente de filter: pase un valor explícito para acotar la cobertura; omítalo para recopilar cobertura de todo lo que toque la ejecución. No se admiten nombres con calificación de espacio de nombres.

skipReport

bool

No

Cuando es true, omite el paso de resumen JSON de reportgenerator y devuelve solo la ruta del XML de Cobertura. Más rápido para el bucle de pruebas interno, donde GetFileCoverage/GetUncoveredBranches/GetCoverageDiff leen el XML directamente. Deje false (valor predeterminado) cuando necesite el Summary.json de GetCoverageSummary.

GetCoverageSummary

Parámetro

Tipo

Obligatorio

Descripción

summaryJsonPath

string

Ruta completa al archivo Summary.json generado

belowTarget

double

No

Cuando se establece (una fracción en [0,1], p. ej. 0.8), devuelve solo las clases cuya cobertura de línea O de rama esté por debajo de este umbral. Omítalo para todas las clases.

topN

int

No

Devuelve solo las N clases con menor cobertura de rama (los resultados se ordenan de peor a mejor). Omítalo para todas las clases.

methodsPerClass

int

No

Conserva como máximo esta cantidad de métodos con menor cobertura de rama por clase, recortando el resto. Omítelo para conservar todos los métodos.

GetFileCoverage

Parámetro

Tipo

Obligatorio

Descripción

coberturaXmlPath

string

Ruta a coverage.cobertura.xml (si no se encuentra, usa .mcp-coverage/.coverage-state como respaldo)

sourceFileName

string

Nombre del archivo fuente a buscar (p. ej., ExampleService.cs)

sessionId

string

No

Resuelve el archivo de estado con ámbito de sesión para aislamiento concurrente.

targetRate

double

No

Umbral de cobertura (0.0–1.0) utilizado para calcular allMeetTarget. Valor predeterminado: 0.8.

GetUncoveredBranches

Parámetro

Tipo

Obligatorio

Descripción

coberturaXmlPath

string

Ruta a coverage.cobertura.xml (si no se encuentra, usa .mcp-coverage/.coverage-state como respaldo)

methodName

string

Nombre del método a inspeccionar (se admite coincidencia parcial; devuelve todos los métodos que coincidan)

sessionId

string

No

Resuelve el archivo de estado con ámbito de sesión para aislamiento concurrente.

GetCoverageDiff

Parámetro

Tipo

Obligatorio

Descripción

coberturaXmlPath

string

Ruta al coverage.cobertura.xml actual

workingDir

string

No

Directorio para almacenar la línea base; por defecto, el directorio principal del XML

sessionId

string

No

Aísla la línea base como .coverage-prev-{hash}.xml y resuelve el archivo de estado con ámbito de sesión.

AppendTestCode

Parámetro

Tipo

Obligatorio

Descripción

testFilePath

string

Ruta completa al archivo de prueba .cs de destino

codeToAppend

string

Código C# a insertar

insertAfterAnchor

string

No

Si se proporciona, inserta el código después de la última aparición de esta cadena (con respaldo tolerante a espacios en blanco). Si se omite, agrega antes de la última }.

CleanupSession

Parámetro

Tipo

Obligatorio

Descripción

workingDir

string

Directorio de trabajo del proyecto que contiene .mcp-coverage/ y los artefactos de TestResults

sessionId

string

No

Cuando se establece, elimina solo los archivos de estado y directorios con ámbito de esta sesión.

maxAgeMinutes

int

No

Cuando se omite sessionId, elimina los artefactos más antiguos que esta cantidad de minutos. Valor predeterminado: 120.

Archivos de estado

Todos los archivos de estado se escriben en un subdirectorio .mcp-coverage/ dentro del directorio de trabajo, manteniendo limpia la raíz del proyecto. Agregue .mcp-coverage/ al .gitignore del repositorio de destino.

Archivo

Propósito

.coverage-state

Ruta XML de Cobertura predeterminada para uso de un solo agente

.coverage-state-{hash}

Ruta XML de Cobertura con ámbito de sesión

.coverage-prev.xml

Línea base de cobertura predeterminada para diff

.coverage-prev-{hash}.xml

Línea base de cobertura con ámbito de sesión

Plugin (Skills y agente)

Este repositorio incluye un directorio plugin/ con skills de Claude Code y una definición de agente para flujos de trabajo guiados de cobertura de pruebas:

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

Las skills admiten NUnit, xUnit y MSTest con documentación de referencia independiente del framework en references/unit.md y references/integration.md.

Dependencias

Paquete

Versión

Propósito

Microsoft.Extensions.Hosting

10.0.7

DI y hospedaje

ModelContextProtocol

1.2.0

Marco de servidor MCP

Microsoft.CodeAnalysis.CSharp

5.3.0

AST de Roslyn para inserción segura de código y conteo preciso de métodos (~15 MB)

Seguridad

dotnet-coverage-mcp se ejecuta como un proceso stdio local y valida cada argumento de herramienta contra COVERAGE_MCP_ALLOWED_ROOT para limitar el acceso al sistema de archivos. Consulte SECURITY.md para conocer el modelo de amenazas, las recomendaciones de endurecimiento y cómo informar una vulnerabilidad.

Contribuciones

Las contribuciones son bienvenidas. Consulte CONTRIBUTING.md para la configuración de desarrollo, las pautas de solicitudes de extracción y las convenciones de código. Los cambios notables se registran en CHANGELOG.md.

Publicación

Solo para mantenedores: el proceso de lanzamiento, la publicación en NuGet y el envío al registro de MCP están documentados en 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