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
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 tú
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
| Herramienta | Qué 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:
| Contexto | Significado | Qué bloquea |
|---|---|---|
proprietary (predeterminado) | Producto de código cerrado que distribuyes | GPL/AGPL/SSPL, BUSL/Elastic, no comercial |
saas-backend | Nunca se distribuye, solo se ejecuta en tus servidores | AGPL/SSPL (disparador de red), BUSL/Elastic |
permissive | Tu propio proyecto es MIT/Apache/BSD | Cualquier copyleft que contamine tus términos |
copyleft-ok | Tu propio proyecto es de la familia GPL | Solo 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), dependenciaspackage.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
.venvninode_modules, las dependencias solo declaradas vuelven comoUNKNOWN. - 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=1para 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