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

wgd5678/license-sentinel MCP server

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

FerramentaO 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:

ContextoSignificadoO que bloqueia
proprietary (padrão)Produto de código fechado que você distribuiGPL/AGPL/SSPL, BUSL/Elastic, não comercial
saas-backendNunca distribuído, só roda nos seus servidoresAGPL/SSPL (gatilho de rede), BUSL/Elastic
permissiveSeu próprio projeto é MIT/Apache/BSDQualquer copyleft que contaminaria seus termos
copyleft-okSeu próprio projeto é da família GPLApenas 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ências package.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 .venv e não tem node_modules, dependências apenas declaradas retornam UNKNOWN.
  • 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=1 para 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