Check if a dependency's license obligates you, based on how you ship. npm, PyPI, Go.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
English | ζ₯ζ¬θͺ
Also listed on mcpservers.org, Smithery, the TensorBlock MCP Index, and the Docker MCP catalog.
Does this dependency's license create an obligation for the way you ship software?
Generic license scanners answer a different question β "what license is this?" β and then warn on everything. LicenseGuard evaluates the license against your distribution model, so the same license produces different verdicts depending on how the software reaches its users.
Live: https://licenseguard.tenchorooms.com
The workers.dev origin below is the same deployment, kept as the stable endpoint the MCP catalogs point at.
| How you ship | AGPL-3.0 dependency |
|---|---|
| SaaS (network-accessible) | blocked β Β§13 network clause |
| Internal use only | allowed |
| Distributed binary / on-prem | blocked β inherited GPL distribution terms |
| devDependency (never in the artifact) | allowed |
That last row is the whole point. A build-time linter under AGPL never ships, so it triggers nothing β but tools that warn on it anyway train people to ignore every warning they produce.
The same split runs through the rest of the license landscape, and the distinctions are not interchangeable:
Verdicts are stated as facts with the clause cited. LicenseGuard does not tell you what to do.
Does the GPL apply if I only host the software and never distribute it? No. GPL-3.0 triggers its obligations on distribution. Hosted SaaS is not distribution, so no obligation arises today β but shipping the same software later, as an on-prem deployment, a binary, or a published library, would trigger whole-work source disclosure.
Does the AGPL apply if I only host the software as a SaaS? Yes. AGPL-3.0 Β§13 requires that users interacting with a modified version over a network be offered the corresponding source of the whole work. This is the clause that makes AGPL behave differently from GPL for hosted services, and it is the entire practical difference between the two.
Do build-time and dev dependencies create license obligations? No. A dev dependency is not part of the artifact you ship, so distribution-triggered obligations do not arise. Tools that emit code into your output, such as code generators, are a separate case worth checking individually.
Is MIT safe for commercial use? Yes, in every distribution model. MIT asks for attribution and nothing more. Apache-2.0 reaches the same result while adding a patent grant and a NOTICE requirement β obligations, but ones that do not vary by how you ship.
Does static linking change the answer?
Only for LGPL, and only for compiled languages. LGPL's design is that you may use the library in a proprietary work provided the user can replace it, which dynamic linking gives you and static linking does not. Go and Rust link statically by default, and nothing in Cargo.lock or go.sum says so.
Why does the same license give different answers for different projects? Because copyleft obligations attach to events β distributing, or letting users interact over a network β not to the presence of the code. Whether those events happen is a fact about your business, not about your repository, which is why a scanner that only reads your lockfile cannot decide it.
You need this when you are adding a dependency, not when you are searching the web. So the primary surface is an MCP tool, not a search result.
Hosted β nothing to install:
Local (stdio) β your manifest never leaves your machine. Only package names and versions are sent to public registries to look up licenses:
The image is published on every release and declared as an OCI package in the official MCP registry, so clients that read the registry can install it without any of this. To build it yourself instead: docker build -t licenseguard . && docker run -i --rm licenseguard.
Both paths run the same policy engine. They cannot disagree β an end-to-end suite (npm run e2e:stdio) pins them together.
Stateless Streamable HTTP, no authentication, no session state.
| Tool | When to call it |
|---|---|
check_dependency_license | Before adding a single dependency |
check_manifest_licenses | To audit a whole manifest or lockfile |
explain_license | To see what a license requires across every distribution model |
The JSON API returns the same verdicts:
Scan a whole lockfile:
An agent-facing index lives at /llms.txt.
Ecosystems: npm Β· PyPI Β· Go modules Β· crates.io Β· RubyGems Β· NuGet
| Format | Transitive deps | Registry lookups |
|---|---|---|
package-lock.json | yes | none β licenses are embedded |
pnpm-lock.yaml, yarn.lock | yes | yes (amortized by a shared cache) |
go.sum | yes | yes |
Cargo.lock, poetry.lock, uv.lock | yes | yes |
Gemfile.lock | yes | yes |
packages.lock.json | yes | yes |
package.json, requirements.txt, pyproject.toml, go.mod, Cargo.toml | direct only | yes |
.csproj, Directory.Packages.props, packages.config | direct only | yes |
| CycloneDX (JSON), SPDX (JSON) | yes | only where the document has no license |
Problem licenses usually arrive as a dependency of a dependency, not as something you added on purpose β so the lockfile path is the one that matters. package-lock.json v2/v3 embeds a license for every entry, which means a full transitive audit with zero network lookups and the exact versions that will actually be installed.
An incomplete scan is never reported as clean. Dependencies that could not be resolved appear as not-checked or review and are counted in the summary. They never become allowed.
A single scan performs at most 300 registry lookups, which bounds what one request can cost. Cached packages don't consume that budget, so the ceiling only binds on packages nobody has looked up yet β a first scan of a ~1000-crate Cargo.lock typically leaves a few dozen entries marked not-checked, and scanning again resolves them (measured: servo's 1043 crates reach zero unresolved published crates on the second pass). The result says so explicitly rather than quietly showing a shorter list.
Git dependencies and members of the workspace being scanned are reported as not-published instead, across every format that identifies them β Cargo.lock's source field, yarn's workspace: and git+ protocols, pnpm's tarball URLs, and package-lock.json's resolved. No public registry has license data for them, so they are never looked up. That is a different situation from hitting the lookup limit: re-scanning will not resolve them, and the result says so.
This matters for more than speed. A workspace member named after a package that also exists publicly β utils, core, or anything else generic β would otherwise be resolved against that unrelated public package and reported as allowed, because the workspace version (0.0.0-use.local) matches nothing and the lookup falls back to the latest release. Marking the origin is what stops a private package from inheriting a stranger's license.
Private registries are the deliberate exception. A resolved URL pointing somewhere other than npmjs is just as likely to be a transparent Artifactory or Nexus proxy serving the real public package, and nothing in the lockfile distinguishes the two β so those are still looked up, and still reported as unresolved if they fail.
CycloneDX and SPDX are read in JSON, including GitHub's {"sbom": β¦} envelope, so the response of gh api repos/OWNER/REPO/dependency-graph/sbom can be pasted unmodified. A license recorded in the document is used as-is; components without one are looked up. NOASSERTION, NONE, and LicenseRef-* are not treated as declarations, because they are the document saying it does not know.
Factual signals from GitHub, npm, and our automated checks β not a rating.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/licenseguard)<a href="https://allmcps.com/mcp/licenseguard"><img src="https://allmcps.com/api/badge/licenseguard?style=directory" alt="LicenseGuard on AllMCPs" /></a>