Aevrin MCP Security Scanner CLI — scan a source repository, local path, or live MCP server.
Project description
aevrin
Aevrin MCP Security Scanner CLI. Wraps the same open-source scanner binaries and normalization logic (aevrin-scanner-core) that the Aevrin backend uses, run locally against your own machine. Results save to your Aevrin dashboard automatically once you're logged in — pass --no-upload for a purely local, ephemeral scan.
Install
pip install aevrin
Requires Docker using Linux containers (each scanner runs in its own disposable container). On Docker Desktop, assign at least 4 GB of memory and permit bind mounts from the system temporary directory. Scanner images are version-pinned and pulled automatically when missing.
Usage
aevrin scan ./my-mcp-server
aevrin scan github.com/owner/repo
aevrin scan https://my-live-server.example.com --json
aevrin scan ./my-mcp-server --fail-on high
aevrin scan ./my-mcp-server --no-upload # skip saving to your dashboard (e.g. in CI)
Target type is auto-detected: a github.com URL scans the full pipeline (static analysis, secrets, dependencies, tool-description checks); another public https:// URL is treated as a live MCP server (runtime description checks only); anything that exists on disk is scanned as a local path (full pipeline, no cloning). Private, loopback, metadata, credential-bearing, and plain-HTTP live targets are rejected. Aevrin never executes submitted stdio MCP commands.
Flags
| Flag | Behavior |
|---|---|
--json |
Machine-readable JSON on stdout instead of a formatted table. |
--no-upload |
Skip saving the result to your Aevrin dashboard (on by default once logged in). Useful in CI, or for a purely local, ephemeral scan. |
--fail-on <severity> |
Minimum severity that causes a non-zero exit code. One of critical, high, medium, low, info. Defaults to high (both critical and high findings fail the build). |
Exit codes
| Code | Meaning |
|---|---|
0 |
Clean — no findings at or above the --fail-on threshold. |
1 |
Findings at or above the --fail-on threshold were found. |
2 |
Couldn't start — authentication, quota, API, target, or flag error. |
3 |
Incomplete — a required scanner category did not execute. This is never treated as a clean pass. |
Results go to stdout; stage progress and diagnostics go to stderr — safe to pipe --json output without stage-progress noise mixed in.
Example output
[✓] static analysis
[✓] secrets
[✓] dependencies
[✓] tool description check
[✓] aggregating
Target: ./my-mcp-server
Score: 62/100 Significant risk — do not deploy as-is
┏━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┓
┃ Severity ┃ Title ┃ OWASP category ┃ Tool ┃
┡━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━┩
│ CRITICAL │ Hardcoded secret │ MCP01: Token Mismanagement │ trivy │
│ HIGH │ subprocess shell true│ MCP05: Command Injection, ... │ semgrep │
└──────────┴──────────────────────┴──────────────────────────────────────┴─────────┘
Development
uv sync
uv run pytest tests -v
uv run ruff check .
uv run mypy src
Project details
Release history Release notifications | RSS feed
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 aevrin-0.1.9.tar.gz.
File metadata
- Download URL: aevrin-0.1.9.tar.gz
- Upload date:
- Size: 101.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 |
4cd49c0c29890f608c76c1efe4ebe74079363d5e88dd0f6b88a763c16174adaa
|
|
| MD5 |
23778f3f408484eb805397b8dc5b2629
|
|
| BLAKE2b-256 |
d4facd6133e8192857985de7f8707371dcd5e59f4fa3fa7bbb67554e5003fe98
|
Provenance
The following attestation bundles were made for aevrin-0.1.9.tar.gz:
Publisher:
publish.yml on aevrin-projects/aevrin-mcp-scanner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aevrin-0.1.9.tar.gz -
Subject digest:
4cd49c0c29890f608c76c1efe4ebe74079363d5e88dd0f6b88a763c16174adaa - Sigstore transparency entry: 2335066214
- Sigstore integration time:
-
Permalink:
aevrin-projects/aevrin-mcp-scanner@b2d1f8d83e492324da585184fdddf7a780be0499 -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/aevrin-projects
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b2d1f8d83e492324da585184fdddf7a780be0499 -
Trigger Event:
push
-
Statement type:
File details
Details for the file aevrin-0.1.9-py3-none-any.whl.
File metadata
- Download URL: aevrin-0.1.9-py3-none-any.whl
- Upload date:
- Size: 20.2 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 |
56fb2294ee0f947e9e6c5fe2fec8acc3fdbe8a4021d8f9685909b778c00ed218
|
|
| MD5 |
144d768f62d3697db6b734c7a293ed04
|
|
| BLAKE2b-256 |
5c2a7f63e673f5ff29fa5ef691e81aa1c8b7ddc06c56e7390e85c35987c9d70c
|
Provenance
The following attestation bundles were made for aevrin-0.1.9-py3-none-any.whl:
Publisher:
publish.yml on aevrin-projects/aevrin-mcp-scanner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aevrin-0.1.9-py3-none-any.whl -
Subject digest:
56fb2294ee0f947e9e6c5fe2fec8acc3fdbe8a4021d8f9685909b778c00ed218 - Sigstore transparency entry: 2335066238
- Sigstore integration time:
-
Permalink:
aevrin-projects/aevrin-mcp-scanner@b2d1f8d83e492324da585184fdddf7a780be0499 -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/aevrin-projects
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b2d1f8d83e492324da585184fdddf7a780be0499 -
Trigger Event:
push
-
Statement type: