license-sentinel
Audit Python and npm dependency licenses for compliance before you ship — an MCP server for AI coding agents.
An AI agent can add pdf-renderer to your project in one second. It will not tell you that
pdf-renderer is AGPL-3.0 and that shipping it inside a closed-source product is a license
violation. License data and compatibility rules are things a model cannot reliably recall —
packages relicense between versions (MongoDB → SSPL, Redis → BUSL, Elasticsearch → Elastic-2.0),
and "the source is on GitHub" does not mean "free to ship".
license-sentinel reads what is actually on your disk and judges it against how you
distribute your product.
- Works for Python and npm in one pass — existing MCP license tools are npm-only.
- Runs locally over stdio. No network calls, no telemetry, nothing leaves your machine.
- Verdicts, not raw data:
CLEAN/REVIEW/BLOCK, each with the reason in plain language.
Tools
| Tool | What it does |
|---|---|
audit_project(path, context) |
Scan a project's dependencies and return counts plus every BLOCKING and REVIEW item with reasons. |
check_package(names, context) |
Check specific packages or messy license strings before installing. Accepts AGPL-3.0, BUSL-1.1, GPLv3, Apache License 2.0, MIT OR Apache-2.0. |
generate_notices(path, output) |
Write a THIRD-PARTY-NOTICES.md attribution document for client hand-off. |
There is also a pre_release_license_review prompt that chains the audit into a go/no-go review.
Install
# run without installing (recommended)
uvx --from license-sentinel license-sentinel
# or install
uv pip install license-sentinel
# or
pip install license-sentinel
Configure your client
Claude Desktop / Cursor / Windsurf / VS Code Copilot / Zed all read the same shape:
{
"mcpServers": {
"license-sentinel": {
"command": "uvx",
"args": ["--from", "license-sentinel", "license-sentinel"]
}
}
}
If you installed with pip instead, use "command": "license-sentinel" with no args.
Restart the client and the three tools appear.
Distribution context
The same dependency is fine in one context and fatal in another, so every tool takes a
context argument:
| Context | Meaning | What it blocks |
|---|---|---|
proprietary (default) |
Closed-source product you distribute | GPL/AGPL/SSPL, BUSL/Elastic, non-commercial |
saas-backend |
Never distributed, only runs on your servers | AGPL/SSPL (network trigger), BUSL/Elastic |
permissive |
Your own project is MIT/Apache/BSD | Anything copyleft that would contaminate your terms |
copyleft-ok |
Your own project is GPL family | Only source-available and non-commercial |
What it reads
- Python:
.venv//venv//env/installed packages (dist-info/METADATA),requirements.txt,pyproject.toml(PEP 621, poetry, dependency-groups) - npm:
node_modules/*/package.json(including scoped packages),package.jsondependencies
If a dependency is declared but not installed, it is reported with an UNKNOWN license rather
than silently dropped — an unlicensed dependency is all-rights-reserved by default.
Privacy
No HTTP client is imported anywhere in this package. The scan is read-only (except
generate_notices, which writes the file you name). Nothing is uploaded.
Limitations
- Not legal advice. It is a fast first pass that catches the expensive mistakes; have counsel review anything flagged.
- Transitive dependencies are read from what is installed. If you have no
.venvand nonode_modules, declared-only dependencies come backUNKNOWN. - The current environment running the server is never scanned, so the server's own packages
never pollute your report. Set
LICENSE_SENTINEL_SCAN_CURRENT_ENV=1to change that.
Development
uv sync
python tests/smoke_test.py # 9 tests, no pytest needed
python tests/e2e_check.py # calls the tools end to end
License
MIT
Metadata
Release files for license-sentinel 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| license_sentinel-0.1.0.tar.gz | 17.7 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| license_sentinel-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 38.9 kB
Release files / license_sentinel-0.1.0.tar.gz
| Download URL | license_sentinel-0.1.0.tar.gz |
|---|---|
| Size | 17.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e5eccdbe480597a634a6b0a0e48b45f0ac94f2a4bd55e7a5c71a1b0ee0bc80e8
|
|
BLAKE2b-256 checksum How to use checksums |
4c849f9199d4ed22a4d4ffaeb49e4ae70e2a39aadbdb5d003fd891055bacfcc0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / license_sentinel-0.1.0-py3-none-any.whl
| Download URL | license_sentinel-0.1.0-py3-none-any.whl |
|---|---|
| Size | 21.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0a3f82897cdc8bf3afbe089346cdb87d25f4071ebfa8ce5fe0ee4f7f9b82d063
|
|
BLAKE2b-256 checksum How to use checksums |
529c6e86a7a0dd76a909304012181cafbb23df1fa639809949b431a74b3d5427
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Security for license-sentinel 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.