CLI Scanner
The scanner is not installable today. @controlzero/scanner has never been
published, to the Control Zero registry or to npmjs.org, so every npx command
below fails with E404 Not Found until it ships:
npm error code E404
npm error 404 Not Found - GET https://npm.controlzero.ai/@controlzero%2fscanner
npm error 404 '@controlzero/scanner@*' is not in this registry.
This page documents the interface implemented in the scanner source. What is missing is distribution: no runnable package has been published. Do not add these commands to a CI pipeline yet — they will fail the build.
The Control Zero CLI scanner analyzes your codebase and identifies AI tool calls that lack governance. It produces a governance grade and actionable findings you can address before shipping.
What It Does
The scanner statically analyzes your project to find:
- AI tool calls that are not wrapped by a Control Zero SDK client
- MCP tool invocations without policy enforcement
- Direct API calls to LLM providers that bypass governance
- Missing or misconfigured policy bundles
Planned usage
Once a package is published, no installation will be required — it runs directly with npx. Configure the Control Zero registry once: add @controlzero:registry=https://npm.controlzero.ai to your .npmrc (or run npm config set @controlzero:registry https://npm.controlzero.ai). It applies to npm install and npx for the whole @controlzero scope.
npx @controlzero/scanner
The scanner auto-detects your project structure and scans all relevant source files.
Scan a Specific Directory
The directory is a positional argument, not a flag:
npx @controlzero/scanner ./src
Output Format
The scanner produces a structured report with a letter grade:
Control Zero Governance Scanner
===============================
Scanning: ./src (47 files)
Grade: B
Findings:
[HIGH] src/agents/analyst.py:42 Direct OpenAI call without CZ wrapper
[HIGH] src/agents/writer.py:18 MCP tool call not governed
[MEDIUM] src/tools/database.py:95 call_tool() missing context parameter
[LOW] src/config.py:12 API key hardcoded (use env var)
Summary: 4 findings (2 high, 1 medium, 1 low)
Grade Scale
| Grade | Meaning |
|---|---|
| A | All AI tool calls are governed. No findings. |
| B | Minor gaps. Most calls are governed. |
| C | Moderate gaps. Several ungoverned calls. |
| D | Large gaps. Most calls are ungoverned. |
| F | No governance detected. |
CI/CD Integration
Use the --fail-on flag to fail your CI pipeline when findings exceed a severity threshold:
# Fail if any HIGH severity findings exist
npx @controlzero/scanner --fail-on high
# Fail if any MEDIUM or higher findings exist
npx @controlzero/scanner --fail-on medium
GitHub Actions Example
name: Governance Check
on: [pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Control Zero Scanner
run: npx @controlzero/scanner --fail-on high
GitLab CI Example
governance-scan:
stage: test
script:
- npx @controlzero/scanner --fail-on high
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
Command Reference
npx @controlzero/scanner [directory] [options]
Arguments:
[directory] Directory to scan (default: current directory)
Options:
-o, --output <format> Output format: console (default), json
--fail-on <sev> Exit with code 1 if findings at this severity or above
Levels: low, medium, high, critical
--no-color Disable colored output
-q, --quiet Only output the grade and finding count
-v, --version Show the scanner version
--help Show help
JSON Output
Use -o json for machine-readable output:
npx @controlzero/scanner -o json
{
"grade": "B",
"findings": [
{
"severity": "high",
"file": "src/agents/analyst.py",
"line": 42,
"message": "Direct OpenAI call without CZ wrapper",
"rule": "ungoverned-llm-call"
}
],
"summary": {
"total": 4,
"high": 2,
"medium": 1,
"low": 1
}
}
Related
- Quick Start: Get started with Control Zero.
- MCP Server: Manage governance from AI coding clients.
- Policies: Learn how to write policies.