CIPHER MCP Scan
CIPHER is a local static scan for MCP-oriented codebases. It inspects a checked-out project locally and runs five focused static checks: authentication, over-privilege, CVE lookup, typosquatting, and tool poisoning.
The tool_poisoning check examines MCP JSON tool metadata for instruction overrides, data-exfiltration requests, dangerous URI schemes, and hidden Unicode control characters. It is always included with the four static checks; remote_oauth remains separate and opt-in through --remote-url.
Optional remote OAuth check
The fifth check is opt-in and runs only when an explicit remote URL is supplied. It probes OAuth well-known metadata, dynamic client registration, and a small set of redirect URI validation cases. It does not run during the normal cipher-scan . workflow or standard CI scans.
cipher-scan ./my-application --remote-url https://example.test/mcp --fail-on high
Remote connection failures are reported as low-severity transport results so static findings and the scan report are preserved. Only accepted dangerous redirect schemes produce high-severity remote findings. Use this check only against systems you are authorized to test; it is intended for lab and explicitly approved environments.
The remote OAuth probe is adapted from the concepts and minimal active probes in remote-mcp-scanner, copyright Nova Security, licensed under the MIT License. The reference project is not imported as a runtime dependency.
Install
pip install cipher-mcp-scan
Use CIPHER directly in the CLI
- Install:
pip install cipher-mcp-scan
- Check it works:
cipher-scan --help - Scan the current directory:
cipher-scan . --fail-on high
- Scan a specific project path:
cipher-scan path/to/project --fail-on high
- Report only without failing CI:
cipher-scan . --fail-on none
- Write a JSON report:
cipher-scan . --fail-on high --format json --output cipher-report.json
- Exit codes:
0= findings are below the selected threshold1= findings are at or above the selected threshold
--fail-onvalues:criticalhighmediumnone
Use CIPHER in GitHub Actions
Add a workflow in your project under .github/workflows/ and run the scanner after checkout. This works for public and private repos because the scan is local to the checked-out code.
Point to the demo file in this repo at examples/github-actions-cipher-scan.yml. You can copy that file into your repo as .github/workflows/cipher-scan.yml, or paste the workflow block below.
name: CIPHER MCP Scan
on:
pull_request:
push:
branches:
- main
- master
workflow_dispatch:
jobs:
cipher-scan:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install CIPHER
run: |
python -m pip install --upgrade pip
pip install cipher-mcp-scan
- name: Run CIPHER scan
env:
GITHUB_STEP_SUMMARY: ${{ github.step_summary }}
run: |
cipher-scan . --fail-on high --summary github --output cipher-scan-report.json
- name: Upload JSON report
if: always()
uses: actions/upload-artifact@v4
with:
name: cipher-scan-report
path: cipher-scan-report.json
if-no-files-found: ignore
To use it in another repo:
- Copy examples/github-actions-cipher-scan.yml to
.github/workflows/cipher-scan.yml - Or paste the block above into that file
- Open a PR or push to
main/masterto trigger the check
Optional flags
--summary githubwrites a markdown summary to the Actions job summary when available--format text|jsonchanges the output style--output REPORT.jsonsaves the machine-readable report
Short note
v0.1 is limited to the built-in CIPHER checks. Optional third-party compare engines are future work and are not required for this package.
Longer internal notes are preserved in README_ARCHIVE.md.
CLI UX
The command-line tool has a short banner on --help / -h and no noisy startup banner on successful scans. Example help output includes the package name, version, example commands, and a one-line fail-on explanation.
Local verification
Run these locally without uploading anything:
pip install -e .
cipher-scan --help
cipher-scan ./test/Cipher-demo-main --fail-on high
The demo path is useful for a quick smoke test because it includes intentionally vulnerable MCP sample code.
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 cipher_mcp_scan-0.1.2.tar.gz.
File metadata
- Download URL: cipher_mcp_scan-0.1.2.tar.gz
- Upload date:
- Size: 49.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3ce36da1c30af4b7bf642e3e928be190d06e08c5aae950d7028c0039c6fa1297
|
|
| MD5 |
110519dd2f14a3f0ee6d2551dfeb0089
|
|
| BLAKE2b-256 |
8156efa75ed1ff5c3707486ad2012535c4b5a9f7bbc97245517b5c5d2f48893a
|
File details
Details for the file cipher_mcp_scan-0.1.2-py3-none-any.whl.
File metadata
- Download URL: cipher_mcp_scan-0.1.2-py3-none-any.whl
- Upload date:
- Size: 52.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3c1183ff0471c9f1ce69733cf1ee75511530c692149b463c4740363662253fc3
|
|
| MD5 |
d1ea12e20cc84618e793f38ee5d60b82
|
|
| BLAKE2b-256 |
5e30603ce4396a32d97ab12f261c8ee1d71becb76f5e3823ce460229f17c30a2
|