license-sentinel

Audita las licencias de dependencias de Python y npm antes de publicar. Veredictos CLEAN / REVIEW / BLOCK, conscientes del contexto, se ejecuta completamente en local a través de stdio.

Documentación

license-sentinel

wgd5678/license-sentinel MCP server

Audita las licencias de dependencias de Python y npm para cumplir normativas antes de publicar: un servidor MCP para agentes de codificación con IA.

Un agente de IA puede añadir pdf-renderer a tu proyecto en un segundo. No te dirá que pdf-renderer es AGPL-3.0 y que incluirlo en un producto de código cerrado es una violación de licencia. Los datos de licencias y las reglas de compatibilidad son cosas que un modelo no puede recordar de forma fiable: los paquetes cambian de licencia entre versiones (MongoDB → SSPL, Redis → BUSL, Elasticsearch → Elastic-2.0), y "el código está en GitHub" no significa "se puede distribuir libremente".

license-sentinel lee lo que realmente hay en tu disco y lo evalúa según cómo distribuyes tu producto.

  • Funciona para Python y npm en una sola pasada: un único escaneo cubre ambas partes de una pila mixta.
  • Se ejecuta localmente a través de stdio. Sin llamadas de red, sin telemetría, nada sale de tu máquina.
  • Veredictos, no datos brutos: CLEAN / REVIEW / BLOCK, cada uno con el motivo en lenguaje claro.

Herramientas

HerramientaQué hace
audit_project(path, context)Escanea las dependencias de un proyecto y devuelve recuentos más todos los elementos BLOQUEANTES y DE REVISIÓN con sus motivos.
check_package(names, context)Comprueba paquetes específicos o cadenas de licencia confusas antes de instalar. Acepta AGPL-3.0, BUSL-1.1, GPLv3, Apache License 2.0, MIT OR Apache-2.0.
generate_notices(path, output)Escribe un documento de atribución THIRD-PARTY-NOTICES.md para la entrega al cliente.

También hay un prompt pre_release_license_review que encadena la auditoría en una revisión de aprobación/rechazo.

Instalación

# run without installing (recommended)
uvx --from license-sentinel license-sentinel

# or install
uv pip install license-sentinel
# or
pip install license-sentinel

Configura tu cliente

Claude Desktop / Cursor / Windsurf / VS Code Copilot / Zed leen todos la misma estructura:

{
  "mcpServers": {
    "license-sentinel": {
      "command": "uvx",
      "args": ["--from", "license-sentinel", "license-sentinel"]
    }
  }
}

Si instalaste con pip en su lugar, usa "command": "license-sentinel" sin args. Reinicia el cliente y aparecerán las tres herramientas.

Contexto de distribución

La misma dependencia es válida en un contexto y fatal en otro, por lo que cada herramienta toma un argumento context:

ContextoSignificadoQué bloquea
proprietary (predeterminado)Producto de código cerrado que distribuyesGPL/AGPL/SSPL, BUSL/Elastic, no comercial
saas-backendNunca se distribuye, solo se ejecuta en tus servidoresAGPL/SSPL (disparador de red), BUSL/Elastic
permissiveTu propio proyecto es MIT/Apache/BSDCualquier copyleft que contamine tus términos
copyleft-okTu propio proyecto es de la familia GPLSolo código disponible y no comercial

Qué lee

  • Python: paquetes instalados .venv/ / venv/ / env/ (dist-info/METADATA), requirements.txt, pyproject.toml (PEP 621, poetry, dependency-groups)
  • npm: node_modules/*/package.json (incluidos paquetes con ámbito), dependencias package.json

Si una dependencia está declarada pero no instalada, se informa con una licencia UNKNOWN en lugar de omitirse silenciosamente: una dependencia sin licencia es todos-los-derechos-reservados por defecto.

Privacidad

No se importa ningún cliente HTTP en ningún lugar de este paquete. El escaneo es de solo lectura (excepto generate_notices, que escribe el archivo que nombres). No se sube nada.

Limitaciones

  • No es asesoramiento legal. Es una primera pasada rápida que detecta los errores costosos; haz que un abogado revise cualquier cosa marcada.
  • Las dependencias transitivas se leen de lo que está instalado. Si no tienes .venv ni node_modules, las dependencias solo declaradas vuelven como UNKNOWN.
  • El entorno actual que ejecuta el servidor nunca se escanea, por lo que los propios paquetes del servidor nunca contaminan tu informe. Establece LICENSE_SENTINEL_SCAN_CURRENT_ENV=1 para cambiar eso.

Desarrollo

uv sync
python tests/smoke_test.py     # 9 tests, no pytest needed
python tests/e2e_check.py      # calls the tools end to end

Licencia

MIT