Skip to main content
Loss of provenance

A previous release had provenance metadata, but this release does not. View details.

aevrin

PyPI version Python versions License Downloads Publish status

Aevrin MCP Security Scanner CLI. Wraps the same open-source scanner binaries and normalization logic (aevrin-scanner) 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

python3 -m pip install --upgrade aevrin

The same CLI is also available through npm:

npm install --global aevrin

Requires Docker using Linux containers: a scan starts the MCP server inside one disposable, version-pinned engine image, which is pulled automatically when missing. On Docker Desktop, assign at least 4 GB of memory and permit bind mounts from the system temporary directory. There is no non-Docker fallback - an unavailable sandbox is an unavailable scan, never a scan performed without one - so use --remote for a local folder if you would rather not run Docker.

Usage

aevrin scan mcp "npx -y @playwright/mcp"   # scan a server by its launch command
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, another public https:// URL as a live MCP server, or anything that exists on disk as a local path. The same checks run either way - one engine over the tools a live server actually returns, in five stages (resolving, launching, enumerating, analyzing, grading) - and the target type only changes how resolving works out what to start. 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).
--remote Scan a local folder on Aevrin's servers instead of this machine, so no Docker or scanner binary is needed locally. Local paths only.

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 (ScanStatus.INCOMPLETE): a stage that had to run did not. 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.

Aevrin prints one grade letter and a risk score, then each finding as its own block rather than a table row, because a table forced every finding down to a title. Stage progress is listed above it. Run aevrin scan --help, or see the full reference for the exact shape: https://docs.mcp.aevrin.net/cli.

Other commands

aevrin login / logout           # browser device-code login, credentials in ~/.aevrin
aevrin agent scan               # what the AI coding agents on this machine may do
aevrin agent scan --json        # versioned snapshot; never contains a credential value
aevrin findings triage <id> <status> [--reason ...]
aevrin mcp-server               # local stdio MCP server with one tool, scan_mcp_server
aevrin mcp-header               # print the Authorization header for Aevrin MCP
aevrin registry publish <dir>   # Aevrin administrators only

mcp-server needs the MCP extra: pip install "aevrin[mcp]", and registry publish the YAML extra: pip install "aevrin[registry]".

Aevrin MCP (https://api.mcp.aevrin.net/mcp) needs your Aevrin API key. mcp-header prints {"Authorization":"Bearer <key>"} from the key aevrin login stored, so Claude Code can read it without the key being written into its config:

claude mcp add-json --scope user aevrin '{"type":"http","url":"https://api.mcp.aevrin.net/mcp","headersHelper":"aevrin mcp-header"}'

agent scan reads configuration only: no agent is started and nothing from a config file is executed. Nothing leaves the machine without --upload. Full reference: https://mcp.aevrin.net/docs/cli.

Development

uv sync
uv run pytest tests -v
uv run ruff check .
uv run mypy -p aevrin.cli

Metadata

Release files for aevrin 0.9.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Loss of provenance

These files do not have provenance metadata, despite files in a prior release including this data.

We recommend further investigation before installing these files. View details.

Source distribution (sdist)

Source distribution for aevrin 0.9.0
File Size Uploaded Provenance
aevrin-0.9.0.tar.gz 190.7 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for aevrin 0.9.0
File Interpreter ABI Platform
aevrin-0.9.0-py3-none-any.whl Python 3 none any Details

Total release size: 257.7 kB

Release files / aevrin-0.9.0.tar.gz

Loss of provenance

This file belongs to a release without provenance metadata, despite a prior release including this data.

We recommend further investigation before installing this file. View details.

Download URL aevrin-0.9.0.tar.gz
Size 190.7 kB
Tags Source
SHA-256 checksum
How to use checksums
5f98a293c4c06900b89210103cda336bd36489c2a368c3d04e2694244f6f5530
BLAKE2b-256 checksum
How to use checksums
7d818fc4d23f36e336a40d14c9710b9ab5b3b231866b353e915547287e40e9bd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / aevrin-0.9.0-py3-none-any.whl

Loss of provenance

This file belongs to a release without provenance metadata, despite a prior release including this data.

We recommend further investigation before installing this file. View details.

Download URL aevrin-0.9.0-py3-none-any.whl
Size 67.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
33270b17ffdf045fc041a7fb5d2d17eca3e7176cb11b1fdb4be27b61f05baf87
BLAKE2b-256 checksum
How to use checksums
ed84f524c4cd75150dca404dc37bffaa0ad97d4737829f7df9af47481690f26b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Security for aevrin 0.9.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.

Loss of provenance

A previous release of these files had provenance metadata, but this release does not.

While this could reflect a routine change by the project maintainers, it may also indicate that the release files have been compromised.

Release comparison

  • Removed 0.7.0 2 files With provenance
  • Added 0.9.0 2 files Without provenance

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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page