license-sentinel
Audite as licenças de dependências Python e npm antes de enviar. Vereditos CLEAN / REVIEW / BLOCK, sensíveis ao contexto, executa totalmente localmente via stdio.
Documentação
license-sentinel
Audite as licenças de dependências Python e npm para conformidade antes de publicar — um servidor MCP para agentes de codificação de IA.
Um agente de IA pode adicionar pdf-renderer ao seu projeto em um segundo. Ele não vai te dizer que
pdf-renderer é AGPL-3.0 e que publicá-lo dentro de um produto de código fechado é uma violação
de licença. Dados de licença e regras de compatibilidade são coisas que um modelo não consegue lembrar com confiabilidade —
pacotes mudam de licença entre versões (MongoDB → SSPL, Redis → BUSL, Elasticsearch → Elastic-2.0),
e "o código-fonte está no GitHub" não significa "livre para publicar".
license-sentinel lê o que está realmente no seu disco e o julga com base em como você
distribui seu produto.
- Funciona para Python e npm em uma única passada — uma varredura cobre ambas as metades de uma stack mista.
- Roda localmente via stdio. Sem chamadas de rede, sem telemetria, nada sai da sua máquina.
- Vereditos, não dados brutos:
CLEAN/REVIEW/BLOCK, cada um com o motivo em linguagem simples.
Ferramentas
| Ferramenta | O que faz |
|---|---|
audit_project(path, context) | Varre as dependências de um projeto e retorna contagens além de todos os itens BLOCKING e REVIEW com motivos. |
check_package(names, context) | Verifica pacotes específicos ou strings de licença confusas antes de instalar. Aceita AGPL-3.0, BUSL-1.1, GPLv3, Apache License 2.0, MIT OR Apache-2.0. |
generate_notices(path, output) | Escreve um documento de atribuição THIRD-PARTY-NOTICES.md para entrega ao cliente. |
Há também um prompt pre_release_license_review que encadeia a auditoria em uma revisão de aprovação/reprovação.
Instalação
# run without installing (recommended)
uvx --from license-sentinel license-sentinel
# or install
uv pip install license-sentinel
# or
pip install license-sentinel
Configure seu cliente
Claude Desktop / Cursor / Windsurf / VS Code Copilot / Zed todos leem o mesmo formato:
{
"mcpServers": {
"license-sentinel": {
"command": "uvx",
"args": ["--from", "license-sentinel", "license-sentinel"]
}
}
}
Se você instalou com pip, use "command": "license-sentinel" sem args.
Reinicie o cliente e as três ferramentas aparecem.
Contexto de distribuição
A mesma dependência é aceitável em um contexto e fatal em outro, então toda ferramenta recebe um
argumento context:
| Contexto | Significado | O que bloqueia |
|---|---|---|
proprietary (padrão) | Produto de código fechado que você distribui | GPL/AGPL/SSPL, BUSL/Elastic, não comercial |
saas-backend | Nunca distribuído, só roda nos seus servidores | AGPL/SSPL (gatilho de rede), BUSL/Elastic |
permissive | Seu próprio projeto é MIT/Apache/BSD | Qualquer copyleft que contaminaria seus termos |
copyleft-ok | Seu próprio projeto é da família GPL | Apenas source-available e não comercial |
O que ele lê
- Python:
.venv//venv//env/pacotes instalados (dist-info/METADATA),requirements.txt,pyproject.toml(PEP 621, poetry, dependency-groups) - npm:
node_modules/*/package.json(incluindo pacotes com escopo), dependênciaspackage.json
Se uma dependência é declarada mas não instalada, ela é reportada com uma licença UNKNOWN em vez de
ser silenciosamente descartada — uma dependência sem licença é todos-os-direitos-reservados por padrão.
Privacidade
Nenhum cliente HTTP é importado em qualquer lugar deste pacote. A varredura é somente leitura (exceto
generate_notices, que escreve o arquivo que você nomear). Nada é enviado.
Limitações
- Não é aconselhamento jurídico. É uma primeira passada rápida que pega os erros caros; tenha um advogado revisando qualquer coisa sinalizada.
- Dependências transitivas são lidas do que está instalado. Se você não tem
.venve não temnode_modules, dependências apenas declaradas retornamUNKNOWN. - O ambiente atual que executa o servidor nunca é varrido, então os próprios pacotes do servidor
nunca poluem seu relatório. Defina
LICENSE_SENTINEL_SCAN_CURRENT_ENV=1para mudar isso.
Desenvolvimento
uv sync
python tests/smoke_test.py # 9 tests, no pytest needed
python tests/e2e_check.py # calls the tools end to end
Licença
MIT