license-sentinel
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 |
| Scan a project's dependencies and return counts plus every BLOCKING and REVIEW item with reasons. |
| Check specific packages or messy license strings before installing. Accepts |
| Write a |
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-sentinelConfigure 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 |
| Closed-source product you distribute | GPL/AGPL/SSPL, BUSL/Elastic, non-commercial |
| Never distributed, only runs on your servers | AGPL/SSPL (network trigger), BUSL/Elastic |
| Your own project is MIT/Apache/BSD | Anything copyleft that would contaminate your terms |
| 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 endLicense
MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/wgd5678/license-sentinel'
If you have feedback or need assistance with the MCP directory API, please join our Discord server