TechDebtMCP

Servidor MCP para analizar y gestionar la deuda técnica en bases de código a través del Model Context Protocol

Documentación

Tech Debt MCP

Servidor MCP de Deuda Técnica

npm version Add to MCP SQALE Rating CodeQL Documentation

16 Herramientas · 2 Recursos · 14 Lenguajes · 10 Ecosistemas de Dependencias

Un servidor de Protocolo de Contexto de Modelo (MCP) para analizar deuda técnica en múltiples lenguajes de programación. Diseñado para integrarse con GitHub Copilot, Claude, Cursor y otras herramientas compatibles con MCP.

Características

  • Soporte multi-lenguaje: JavaScript, TypeScript, Python, Java, Swift, Kotlin, Objective-C, C++, C, C#, Go, Rust, Ruby, PHP
  • Análisis integral: Detecta varios tipos de deuda técnica, incluyendo problemas de calidad de código, vulnerabilidades de seguridad y problemas de mantenibilidad
  • Métricas SQALE: Calcula deuda técnica con el sistema de calificación SQALE (escala A-E)
  • Análisis SwiftUI: Comprobaciones especializadas para patrones SwiftUI, gestión de estado, fugas de memoria, anidamiento de vistas y problemas de concurrencia
  • Reglas personalizadas: Define tus propias comprobaciones basadas en patrones con soporte de regex
  • Análisis de dependencias: Analiza manifiestos de paquetes en 10 ecosistemas (npm, pip, Maven/Gradle, Cargo, Go Modules, Composer, Bundler, NuGet, C/C++, Swift)
  • Supresión en línea: Suprime falsos positivos con // techdebt-ignore-next-line o comentarios de bloque
  • Validación de configuración: Valida archivos de configuración .techdebtrc.json para verificar la corrección del esquema
  • Recomendaciones accionables: Proporciona sugerencias priorizadas para abordar la deuda técnica
  • Filtrado flexible: Filtra resultados por severidad, categoría o lenguaje
  • Endurecido en seguridad (v2.0.2): Prevención de traversal de rutas en todas las entradas de rutas de herramientas y recursos, validación de regex de reglas personalizadas segura contra ReDoS, escape de inyección de regex en comprobaciones SwiftUI, sanitización de rutas absolutas en todos los mensajes de error y escaneo SAST con CodeQL en cada push/PR

Lenguajes Soportados

LenguajeExtensionesComprobaciones clave
JavaScript.js, .mjs, .cjs, .jsxconsole.log, debugger, eslint-disable, uso de ejecución dinámica de código, uso de var
TypeScript.ts, .tsx, .mts, .ctstipo any, @ts-ignore, aserciones no nulas, aserciones de tipo
Python.py, .pyw, .pyiexcept desnudo, sentencias print, uso de global, ejecución dinámica de código
Java.javaSystem.out, printStackTrace, catch vacío, @SuppressWarnings
Swift.swiftforce unwrap (!), force cast (as!), force try, ciclos de retención, patrones SwiftUI
Kotlin.kt, .kts!!, abuso de lateinit, @Suppress, casts sin verificar
Objective-C.m, .mm, .hNSLog, ciclos de retención, métodos obsoletos, controladores de vista masivos
C++.cpp, .cc, .hpp, .hpunteros crudos, casts estilo C, goto, using namespace std
C.c, .hmalloc sin free, goto, funciones inseguras, comprobaciones nulas
C#.csConsole.WriteLine, async void, catch vacío, patrón dispose
Go.goerrores ignorados, imports en blanco, fmt.Print, panic, variables globales
Rust.rsunwrap, expect, unsafe, atributos allow, panic, println
Ruby.rbputs, binding.pry, rubocop disable, ejecución dinámica de código, variables globales
PHP.phpvar_dump, print_r, die/exit, ejecución dinámica de código, supresión de errores

Instalación

VS Code: Install Server

Instalación con un clic

VS Code (vía Terminal):

code --add-mcp '{"name":"tech-debt-mcp","command":"npx","args":["-y","tech-debt-mcp@latest"]}'
Cursor: Install Server

Instalación con un clic

Cursor (vía Terminal):

cursor --add-mcp '{"name":"tech-debt-mcp","command":"npx -y tech-debt-mcp@latest"}'
Claude: Install Server

Claude Code (vía Terminal):

claude mcp add tech-debt-mcp -- npx -y tech-debt-mcp@latest

Claude Desktop — añade a tu claude_desktop_config.json:

{
  "mcpServers": {
    "tech-debt-mcp": {
      "command": "npx",
      "args": ["-y", "tech-debt-mcp@latest"]
    }
  }
}
Claude Code: Install as Plugin

Plugin de Claude Code — añade el marketplace de este repositorio y luego instala el plugin:

/plugin marketplace add PierreJanineh/TechDebtMCP
/plugin install tech-debt-mcp@techdebtmcp

El plugin ejecuta npx -y tech-debt-mcp@latest internamente — sin empaquetado de código fuente, siempre sigue la versión publicada en npm. Consulta plugin/README.md para documentación orientada a usuarios del plugin (flujo de instalación, transcripciones de ejemplo, postura de seguridad).

Claude Desktop: Install MCPB Bundle

Paquete MCPB de Claude Desktop — instalación con un clic con node_modules incluido (sin npx, sin necesidad de internet en tiempo de ejecución).

Descarga tech-debt-mcp-<version>.mcpb desde la última versión de GitHub y ábrela con Claude para macOS o Windows.

Para compilar el paquete localmente:

npm install --include=dev --ignore-scripts
npm run mcpb:pack
# -> mcpb/tech-debt-mcp-<version>.mcpb
Windsurf: Install Server

Añade a tu configuración MCP de Windsurf (~/.codeium/windsurf/mcp_config.json):

{
  "mcpServers": {
    "tech-debt-mcp": {
      "command": "npx",
      "args": ["-y", "tech-debt-mcp@latest"]
    }
  }
}
JetBrains: Install Server

Vía AI Assistant — abre Settings > Tools > AI Assistant > Model Context Protocol (MCP), haz clic en +, selecciona As JSON y pega:

{
  "mcpServers": {
    "tech-debt-mcp": {
      "command": "npx",
      "args": ["-y", "tech-debt-mcp@latest"]
    }
  }
}
Xcode: Install Server

Vía GitHub Copilot for Xcode — abre Settings > pestaña MCP > Edit Config (mcp.json):

{
  "servers": {
    "tech-debt-mcp": {
      "command": "npx",
      "args": ["-y", "tech-debt-mcp@latest"]
    }
  }
}

Configuración Manual

Añade a la configuración de tu cliente MCP:

{
  "mcpServers": {
    "tech-debt-mcp": {
      "command": "npx",
      "args": ["-y", "tech-debt-mcp@latest"]
    }
  }
}

Para desarrollo: npm run dev

Herramientas

Cada herramienta declara una anotación de herramienta — las herramientas Read no tienen efectos secundarios (readOnlyHint: true); las herramientas Write mutan el estado de la sesión del servidor (destructiveHint: true).

CategoríaHerramientaTipoDescripción
Análisisanalyze_projectLecturaAnaliza todo el proyecto — filtra por lenguaje, categoría, severidad, maxFiles
analyze_fileLecturaAnaliza un solo archivo
get_debt_summaryLecturaResumen rápido con puntuación de salud y conteo de problemas
get_sqale_metricsLecturaCalificación SQALE, tiempo de remediación, ratio de deuda, desgloses
Filtradoget_recommendationsLecturaSugerencias de corrección priorizadas (límite configurable)
get_issues_by_severityLecturaProblemas filtrados por nivel de severidad
get_issues_by_categoryLecturaProblemas filtrados por categoría de deuda
list_supported_languagesLecturaTodos los lenguajes con sus comprobaciones
Reglas Personalizadasadd_custom_ruleEscrituraAñade una regla de deuda técnica basada en regex
remove_custom_ruleEscrituraElimina una regla personalizada por ID
list_session_custom_rulesLecturaLista las reglas añadidas vía add_custom_rule en esta sesión (no incluye .techdebtrc.json customPatterns)
execute_custom_rulesLecturaEjecuta reglas personalizadas contra código o archivo
validate_custom_patternLecturaPrueba un patrón antes de añadirlo
Dependenciascheck_dependenciesLecturaEscanea manifiestos de paquetes en 10 ecosistemas
get_vulnerability_reportLecturaInventario de dependencias sin conexión para revisión de CVE
validate_configLecturaValida el esquema de .techdebtrc.json

Categorías de deuda utilizadas en todo el sistema: dependency · code-quality · architecture · documentation · testing · security · performance · maintainability

Análisis — referencia de parámetros
HerramientaParámetroTipoRequeridoRestricciones / predeterminadoDescripción
analyze_projectpathstring✓ruta absoluta del sistema de archivosDirectorio raíz del proyecto
languagesstring[]Filtrar a lenguajes específicos
categoriesstring[]ver categorías anterioresFiltrar por categorías de deuda
severityenumlow / medium / high / criticalNivel mínimo de severidad
maxFilesintegermin: 1Límite de archivos analizados
analyze_filepathstring✓ruta absoluta del sistema de archivosArchivo a analizar
get_debt_summarypathstring✓ruta absoluta del sistema de archivosDirectorio raíz del proyecto
get_sqale_metricspathstring✓ruta absoluta del sistema de archivosDirectorio raíz del proyecto
developmentTimenumberhorasTiempo de desarrollo estimado para el cálculo del ratio de deuda

get_sqale_metrics devuelve una calificación SQALE (A-E) con visualización de estrellas, tiempo total de remediación, ratio de deuda y desgloses por severidad y categoría.

Filtrado — referencia de parámetros
HerramientaParámetroTipoRequeridoRestricciones / predeterminadoDescripción
get_recommendationspathstring✓ruta absoluta del sistema de archivosDirectorio raíz del proyecto
limitintegerpredeterminado: 5, min: 1Máximo de recomendaciones a devolver
get_issues_by_severitypathstring✓ruta absoluta del sistema de archivosDirectorio raíz del proyecto
severityenum✓low / medium / high / criticalSeveridad para filtrar
get_issues_by_categorypathstring✓ruta absoluta del sistema de archivosDirectorio raíz del proyecto
categoryenum✓ver categorías anterioresCategoría de deuda para filtrar
list_supported_languages————Sin parámetros
Reglas Personalizadas — referencia de parámetros | Herramienta | Parámetro | Tipo | Requerido | Restricciones / predeterminado | Descripción | |------|-----------|------|:--------:|----------------------|-------------| | `add_custom_rule` | `id` | string | ✓ | | Identificador único de regla | | | `pattern` | string | ✓ | máx. 1,000 caracteres | Patrón regex a coincidir | | | `message` | string | ✓ | | Título/mensaje del problema | | | `severity` | enum | ✓ | `low` / `medium` / `high` / `critical` | Nivel de severidad | | | `category` | enum | ✓ | ver categorías arriba | Categoría de deuda | | | `suggestion` | string | | | Cómo corregir el problema | | | `languages` | string[] | | | Restringir a lenguajes específicos | | | `flags` | string | | permitidos: `d g i m s u v y`; `u` / `v` mutuamente excluyentes | Banderas regex | | `remove_custom_rule` | `id` | string | ✓ | | ID de regla a eliminar | | `list_session_custom_rules` | — | — | — | — | Sin parámetros. Renombrado de `list_custom_rules` (TEC-51) para aclarar el alcance: solo reglas registradas en la sesión. | | `execute_custom_rules` | `path` | string | ◐ | ruta absoluta, máx. 500,000 bytes | Archivo a analizar | | | `code` | string | ◐ | 1-500,000 caracteres | Código fuente a analizar directamente | | | `language` | string | | debe ser un ID de lenguaje soportado (mismo conjunto que `list_supported_languages`) | Filtrar reglas por lenguaje | | `validate_custom_pattern` | `id` | string | ✓ | | Identificador único de regla | | | `pattern` | string | ✓ | máx. 1,000 caracteres | Regex a validar | | | `message` | string | ✓ | | Título/mensaje del problema | | | `severity` | enum | ✓ | `low` / `medium` / `high` / `critical` | Nivel de severidad | | | `category` | enum | ✓ | ver categorías arriba | Categoría de deuda |

◐ execute_custom_rules requiere ya sea path o code, no ambos requeridos. Una cadena vacía "" para path se trata igual que omitir el campo.

Dependencias — referencia de parámetros
HerramientaParámetroTipoRequeridoRestricciones / predeterminadoDescripción
check_dependenciespathstring✓ruta absoluta del sistema de archivosDirectorio raíz del proyecto
includeDevbooleanpredeterminado: trueIncluir dependencias de desarrollo/pruebas
get_vulnerability_reportpathstring✓ruta absoluta del sistema de archivosDirectorio raíz del proyecto
includeDevbooleanpredeterminado: falseIncluir dependencias de desarrollo
validate_configpathstring✓ruta absoluta del sistema de archivosDirectorio raíz del proyecto o ruta directa a .techdebtrc.json

check_dependencies detecta manifiestos para npm, pip, Maven/Gradle, Cargo, Go Modules, Composer, Bundler, NuGet, C/C++ (CMakeLists.txt, conanfile.txt/py, vcpkg.json) y Swift Package Manager. get_vulnerability_report produce un inventario de dependencias sin conexión — consulte ROADMAP.md para la búsqueda planificada de CVE en línea.

Recursos

Dos recursos MCP exponen datos de deuda técnica de solo lectura como JSON. Ambos usan plantillas URI RFC 6570: la sintaxis {+projectPath} es expansión reservada, que permite que la variable contenga los caracteres / de una ruta absoluta del sistema de archivos sin codificación de porcentaje.

Plantilla URIDescripción
debt://summary/{+projectPath}Puntuación de salud, puntuación de deuda, conteos de problemas y métricas SQALE
debt://issues/{+projectPath}Lista filtrable de todos los problemas de deuda técnica; admite parámetros de consulta severity, category y limit

Ejemplos concretos — sustituya {+projectPath} con una ruta absoluta. Observe la doble barra: el / final de la plantilla más el / inicial de la ruta producen //, que es sintaxis URI válida.

debt://summary//Users/you/projects/myapp
debt://issues//Users/you/projects/myapp
debt://issues//Users/you/projects/myapp?severity=high&limit=50
debt://issues//Users/you/projects/myapp?category=security

Pruebas interactivas — la forma más fácil de ejercitar herramientas y recursos es el MCP Inspector:

npm run build
npx @modelcontextprotocol/inspector node dist/index.js

Abra la URL que imprime, cambie a la pestaña Recursos y lea una plantilla URI con la ruta absoluta de su proyecto.

Configuración

Cree un archivo .techdebtrc.json en la raíz de su proyecto:

{
  "include": ["src/**", "lib/**"],
  "ignore": ["vendor/**", "generated/**"],
  "rules": {
    "maxFileLines": 500,
    "maxFunctionLines": 50,
    "maxComplexity": 10,
    "maxNestingDepth": 4
  },
  "severity": {
    "todo-comment": "low",
    "console-log": "medium"
  },
  "ruleExclusions": {
    "debugger": ["**/src/analyzers/**"],
    "ts-ignore": ["**/src/analyzers/**"]
  },
  "customPatterns": [
    {
      "id": "no-console-log",
      "pattern": "console\\.log",
      "severity": "low",
      "category": "code-quality",
      "message": "Remove console.log() statements",
      "suggestion": "Use proper logging library instead",
      "languages": ["javascript", "typescript"]
    }
  ]
}

Anulaciones de Lenguaje

Anule reglas, severidad o extensiones de archivo por lenguaje usando languageOverrides. Las claves deben ser identificadores de lenguaje soportado válidos.

{
  "languageOverrides": {
    "typescript": {
      "rules": {
        "maxFileLines": 800,
        "maxFunctionLines": 80
      },
      "severity": {
        "todo-comment": "high"
      }
    },
    "python": {
      "extensions": [".pyx"],
      "rules": {
        "maxComplexity": 15
      }
    }
  }
}
  • rules — umbrales por lenguaje (anulan el rules de nivel superior para archivos coincidentes).
  • severity — anulaciones de severidad de reglas por lenguaje.
  • extensions — extensiones de archivo adicionales (más allá de los predeterminados) para atribuir a este lenguaje.

Exclusiones de Reglas

Use ruleExclusions para suprimir reglas específicas para archivos que coincidan con patrones glob. Los patrones usan barras diagonales (/) en todas las plataformas. Use patrones con prefijo **/ (por ejemplo, **/src/analyzers/**) para una coincidencia confiable independientemente del formato de ruta.

Supresión en Línea

Suprima problemas específicos directamente en el código fuente. Ambos prefijos de comentario // y # son soportados en todos los lenguajes.

Una línea — suprime la siguiente línea:

// techdebt-ignore-next-line debugger
debugger; // only the 'debugger' rule is suppressed
# techdebt-ignore-next-line print-statement
print("debug output")  # will not be reported

Bloque — suprime todas las líneas entre inicio y fin:

// techdebt-ignore-start ts-ignore
issues.push(...this.checkPattern(filePath, content, /@ts-ignore/g, { ... }));
// techdebt-ignore-end ts-ignore

Sin un nombre de regla, se suprimen todas las reglas. Los bloques pueden anidarse. Los comentarios de supresión deben aparecer en su propia línea.

Ejemplo de Reglas Personalizadas

Nota de alcance: customPatterns definidas en .techdebtrc.json se aplican solo mediante analyze_project, que carga la configuración del proyecto antes de escanear. analyze_file invoca el analizador de lenguaje directamente sin cargar .techdebtrc.json, por lo que los patrones definidos en la configuración no se aplican en esa ruta. Use add_custom_rule en tiempo de ejecución (o llame a execute_custom_rules directamente) para ejecutar patrones personalizados contra un solo archivo.

Defina patrones en .techdebtrc.json bajo customPatterns, o regístrelos en tiempo de ejecución mediante la herramienta MCP add_custom_rule:

{
  "customPatterns": [
    {
      "id": "no-magic-numbers",
      "pattern": "=\\s*\\d{3,}",
      "severity": "medium",
      "category": "maintainability",
      "message": "Magic number detected",
      "suggestion": "Extract to named constant"
    },
    {
      "id": "forbidden-library",
      "pattern": "import.*moment.*from",
      "severity": "medium",
      "category": "dependency",
      "message": "moment.js is deprecated",
      "suggestion": "Use native Date or date-fns instead",
      "languages": ["javascript", "typescript"]
    }
  ]
}

Métricas SQALE

Tech Debt MCP usa la metodología SQALE para cuantificar la deuda técnica:

CalificaciónRatio de DeudaCalidad
A≤5%Excelente
B6-10%Buena
C11-20%Aceptable
D21-50%Pobre
E>50%Crítica

Mapeo esfuerzo-tiempo: trivial (≤5m) · pequeño (5-30m) · mediano (30m-2h) · grande (2-4h) · muy grande (4h+)

Análisis SwiftUI

14 verificaciones especializadas para aplicaciones SwiftUI que cubren gestión de estado (@State excesivo, mal uso de @ObservedObject, seguridad de valores de entorno), memoria y ciclo de vida (ciclos de retención en Combine, limpieza de temporizadores, cancelación de tareas, ciclos de retención en cierres), rendimiento (modificadores .id() faltantes, cálculos costosos en el cuerpo, anidamiento profundo, mal uso de GeometryReader) y mejores prácticas (borrado de tipo AnyView, NavigationLink obsoleto, seguridad del hilo principal).

Ver todas las verificaciones SwiftUI con ejemplos

Problemas de Gestión de Estado

  • Variables @State Excesivas - Detecta vistas con >5 variables @State que deberían usar un ViewModel
  • Mal Uso de @ObservedObject - Marca @ObservedObject con inicialización (debería usar @StateObject)
  • Seguridad de Valores de Entorno - Detecta desenvuelto forzado de valores @Environment

Memoria y Ciclo de Vida

  • Referencias Circulares en Combine - Encuentra [weak self] faltante en sumideros Combine
  • Limpieza de Temporizadores Faltante - Detecta Timers sin limpieza en onDisappear
  • Cancelación de Tareas Faltante - Marca tareas async sin manejo de cancelación
  • Ciclos de Retención en Cierres - Detecta capturas de self en onChange/onReceive sin [weak self]

Rendimiento y Jerarquía de Vistas

  • Modificadores .id() Faltantes - Detecta ForEach sin identificadores estables
  • Cálculos Costosos en el Cuerpo de la Vista - Marca reduce/sort/filter en cuerpos de vista
  • Anidamiento Profundo de Vistas - Advierte cuando la profundidad de anidamiento supera 6 niveles
  • Mal Uso de GeometryReader - Detecta GeometryReader en la raíz de la vista

Mejores Prácticas SwiftUI

  • Borrado de Tipo AnyView - Sugiere usar genéricos o @ViewBuilder en su lugar
  • NavigationLink Obsoleto - Marca patrones NavigationLink de estilo antiguo
  • Seguridad del Hilo Principal - Asegura que las actualizaciones de UI ocurran en el hilo principal

Ejemplos de Problemas Detectados

// Excessive @State - should use ViewModel
struct UserView: View {
  @State private var firstName = ""
  @State private var lastName = ""
  @State private var email = ""
  @State private var phone = ""
  @State private var address = ""
  @State private var city = ""  // 6+ @State variables!
}

// @ObservedObject with initialization
struct ContentView: View {
  @ObservedObject var viewModel = UserViewModel()  // Should be @StateObject!
}

// Missing Timer cleanup
struct TimerView: View {
  var body: some View {
    Text("Hello")
      .onAppear {
        Timer.scheduledTimer(...)  // Missing .onDisappear cleanup!
      }
  }
}

// Retain cycle in Combine
publisher
  .sink { value in
    self.updateUI(value)  // Missing [weak self]!
  }

Ejemplo de Salida

# Tech Debt Analysis Report

## Health Score: 72/100

### Issues by Severity
| Severity | Count |
|----------|-------|
| Critical | 2 |
| High | 15 |
| Medium | 45 |
| Low | 120 |

## Top Recommendations

1. **Address Critical Issues Immediately**
   Fix 2 critical security issues.

2. **Clean Up TODO/FIXME Comments**
   Found 45 TODO comments - consider creating tracked issues.

Calidad del Código

Tech Debt MCP practica lo que predica — construido con codificación asistida por IA, mantiene una calificación A al escanearse regularmente. Refactorizaciones internas (por ejemplo, reducción de anidamiento en customRulesEngine.validatePattern mediante helper extraído — #146) son impulsadas por hallazgos de autoescaneo.

Resultados de Autoescaneo (v2.0.2, abril 2026)

  • Calificación SQALE: A (Excelente)
  • Puntuación de Deuda: 5/100 (Objetivo: ≤5/100)
  • Problemas Totales: 13 (0 críticos, 0 altos, 6 medios, 7 bajos)
  • Tiempo de Remediación: 14 horas
  • Puntuación de Salud: 95/100

Bajó de 118 problemas / 42.4 de salud en la línea base v2.0.1 después del endurecimiento de seguridad v2.0.2, configuración ruleExclusions, refactorizaciones de anidamiento (#113, #118, #131, #146) y extracción del manejador de reglas personalizadas (#145). Deuda restante: 5 puntos de anidamiento (4 en módulos de servidor/núcleo + 1 en eslint.config.mjs), 7 usos de aserción de tipo en límites del sistema y 1 aserción no nula. Consulte TECH_DEBT_SCAN.md para detalles por problema.

Desarrollo

npm install --include=dev --ignore-scripts  # Install dependencies (incl. devDependencies)
npm run typecheck  # Type-check without emitting output
npm run lint       # Lint source files
npm run build      # Compile TypeScript
npm run dev        # Run with ts-node
npm run watch      # Watch mode
npm test           # Run tests

Documentación

Privacidad

Tech Debt MCP se ejecuta completamente en su máquina. Una vez instalado, lee los archivos que usted le pasa, devuelve problemas a su cliente MCP a través del transporte stdio local y no hace nada más — el servidor en sí no realiza llamadas de red salientes, no tiene telemetría, no tiene análisis y no usa servicios de terceros. La instalación mediante npm/npx sí contacta el registro npm como comportamiento estándar del gestor de paquetes; el paquete MCPB se envía preinstalado y no necesita acceso de red adicional. Consulte PRIVACY.md o la política alojada en https://pierrejanineh.github.io/TechDebtMCP/privacy para detalles.

Contribuciones

¡Las contribuciones son bienvenidas! Consulte CONTRIBUTING.md para las guías y CODE_OF_CONDUCT.md para nuestros estándares comunitarios.

Publicaciones

  • Última: npm version
  • Publicaciones: GitHub Releases
  • Hoja de ruta: Consulte ROADMAP.md para características planificadas
  • Seguridad: escapeRegExp() (src/utils/regexUtils.ts) debe usarse al interpolar cadenas capturadas en new RegExp() — consulte el problema #128; la salida del manejador usa basename() / getRelativePath() para prevenir la fuga de rutas absolutas del sistema de archivos en mensajes intencionales, y las cadenas err.message crudas de operaciones del sistema de archivos se sanitizan antes de devolverse a los clientes — consulte el problema #129

Licencia

MIT