mcpseal
Source, issues and docs: https://github.com/confuseddude/mcpseal
An MCP tool-integrity CLI: pins the hash of every approved MCP tool definition and blocks execution the instant a tool's description or input schema drifts — the pattern known as a "rug pull," where a server changes a tool's behavior after you've already trusted it. Free, local, zero-infra.
What it does
mcpseal initlaunches each MCP server your client is configured to use, records every tool's name/description/input schema as a cryptographic hash, and writes a.mcp-lock.jsonyou commit to your repo (likepackage-lock.json).mcpseal installrewrites your client's config so it launches your servers throughmcpseal proxyinstead of directly.- From then on, every time a tool definition is served to your client,
mcpsealre-hashes it and compares against the pinned hash. A match forwards normally. A mismatch gets blocked before your client ever sees it, with the exact old-vs-new description shown.
Privacy
Nothing leaves your machine, ever, unless you explicitly run mcpseal login. No telemetry, no network calls, no account required. login is entirely optional and only relevant if your organization runs the paid Control Plane — everything above is the complete product for a solo developer.
Quickstart
uvx mcpseal init
uvx mcpseal install
or, if you prefer a persistent install:
pip install mcpseal
mcpseal init
mcpseal install
Commands
| Command | What it does |
|---|---|
mcpseal init |
Discover MCP servers, hash every tool, write .mcp-lock.json |
mcpseal install |
Route your client's servers through the proxy |
mcpseal uninstall |
Restore your original client config exactly |
mcpseal scan [--json] |
Re-check all tools now; non-zero exit on drift (CI-friendly) |
mcpseal approve <server> <tool> |
Trust a tool's current definition (local lockfile only) |
mcpseal deny <server> <tool> |
Block a tool even if its hash matches |
mcpseal diff |
Show the old-vs-new description for any drifted tool |
mcpseal status [--json] |
LOCAL HEALTH + CONTROL PLANE summary, always works offline |
mcpseal doctor [--json] |
Deeper diagnostics; Control Plane unreachability never fails it |
mcpseal login / logout |
Optional: connect/disconnect this machine to a hosted workspace |
mcpseal policy-pull |
Fetch and verify a signed org policy, if connected |
Full source, architecture docs, and the Node.js twin of this CLI are in the same monorepo this package is built from.
Verifying what you installed
Every release is published from GitHub Actions with no stored credentials, and carries build provenance you can check yourself:
mcpseal --version
npm audit signatures # npm: verifies the SLSA provenance attestation
PyPI attestations (PEP 740) are shown on the project page and name the exact repo, workflow and commit that produced the artifact.
Reporting a vulnerability
See SECURITY.md.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mcpseal-0.1.3.tar.gz.
File metadata
- Download URL: mcpseal-0.1.3.tar.gz
- Upload date:
- Size: 54.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2c1c97cb0a4c448ab69320496629f655a2eae5161217e5e6dabf99e437cb34e
|
|
| MD5 |
6a07f63c7de0d10ba49a066be3380f5b
|
|
| BLAKE2b-256 |
6adfafcd025b6a999d831c768405b054cc5341a168854ffdc86dc71ad42f13e9
|
Provenance
The following attestation bundles were made for mcpseal-0.1.3.tar.gz:
Publisher:
publish.yml on confuseddude/mcpseal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcpseal-0.1.3.tar.gz -
Subject digest:
e2c1c97cb0a4c448ab69320496629f655a2eae5161217e5e6dabf99e437cb34e - Sigstore transparency entry: 2568135178
- Sigstore integration time:
-
Permalink:
confuseddude/mcpseal@7c3ddd8aac02670a254eb21de06b916ee4ada440 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/confuseddude
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7c3ddd8aac02670a254eb21de06b916ee4ada440 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mcpseal-0.1.3-py3-none-any.whl.
File metadata
- Download URL: mcpseal-0.1.3-py3-none-any.whl
- Upload date:
- Size: 47.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
30e530f86c69a6ec0388bf06958429c8756da1fa34b0c097d3a8dd0128b1bb23
|
|
| MD5 |
2511e644a1f2968bd8e35f1ecc254360
|
|
| BLAKE2b-256 |
e7ecde22727aecd72f5a3a49ff9bee9ecf88426cdbde1a59233645d963189f53
|
Provenance
The following attestation bundles were made for mcpseal-0.1.3-py3-none-any.whl:
Publisher:
publish.yml on confuseddude/mcpseal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcpseal-0.1.3-py3-none-any.whl -
Subject digest:
30e530f86c69a6ec0388bf06958429c8756da1fa34b0c097d3a8dd0128b1bb23 - Sigstore transparency entry: 2568135180
- Sigstore integration time:
-
Permalink:
confuseddude/mcpseal@7c3ddd8aac02670a254eb21de06b916ee4ada440 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/confuseddude
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7c3ddd8aac02670a254eb21de06b916ee4ada440 -
Trigger Event:
push
-
Statement type: