plugin-scanner has five maintainer and CI commands. Each one answers a different release question. A bare path such as plugin-scanner . runs scan.
Run plugin-scanner <command> --help for the flags in your installed version.
scan
Use scan for the weighted summary view:
plugin-scanner scan ./my-plugin --format json --profile public-marketplace
plugin-scanner scan . --format sarif --output plugin-scanner.sarif
plugin-scanner scan . --min-score 80 --fail-on-severity high
scan evaluates only the surfaces a plugin actually exposes, then normalizes the final score across applicable checks.
| Flag | Meaning |
|---|---|
--format | text (default), json, markdown, or sarif. --json is shorthand for --format json. |
--output, -o | write the report to a file instead of printing it |
--profile | default, public-marketplace, or strict-security |
--config, --baseline | scanner config file and baseline suppression file |
--min-score | exit with an error when the score is below this number (default 0) |
--fail-on-severity | exit with an error when a finding meets this severity: none (default), critical, high, medium, low, or info |
--strict | exit with an error when any finding is present |
--ecosystem | auto (default) or one ecosystem id, see Ecosystems and repository mode |
--cisco-skill-scan, --cisco-mcp-scan | auto (default), on, or off |
--cisco-policy | permissive, balanced (default), or strict |
scan exits with status 1 when the score is below --min-score, a severity or --strict gate trips, or the selected policy profile fails.
lint
Use lint for rule-oriented authoring feedback:
plugin-scanner lint ./my-plugin --list-rules
plugin-scanner lint ./my-plugin --explain README_MISSING
plugin-scanner lint ./my-plugin --fix --profile strict-security
--list-rules prints one rule per line with its category, default severity, and whether it is fixable. --explain <rule id> prints the rule definition as JSON. --fix applies safe mechanical fixes to the files before linting and prints each change. lint accepts --format text or --format json, the same policy flags as scan (--profile, --config, --baseline, --strict), and exits with status 1 when the policy profile fails.
verify
Use verify for manifest, marketplace, MCP, skill, app, and asset readiness checks:
plugin-scanner verify ./my-plugin --format json
plugin-scanner verify . --format json
plugin-scanner verify ./my-plugin --online --format text
verify accepts --format text (default) or --format json and exits with status 1 unless every case passes.
MCP checks work like this:
- Remote MCP URLs must use HTTPS, must not embed credentials, and must not point at local or non-public addresses.
- Without
--online, remote endpoints are recorded as anoffline-skipand no network request is made. - With
--online, the scanner resolves the hostname, requires public addresses, and probes the endpoint over a pinned HTTPS connection with a short timeout. A2xxresponse is reachable.401and403are recorded as auth required. Redirects are refused. - Stdio MCP server commands are never executed. Each declared stdio server is recorded as a
safety-skipcase that counts as not passed, so it needs manual review before you trust it.
submit
Use submit for one artifact-backed gate before release or ecosystem intake:
plugin-scanner submit ./my-plugin --profile public-marketplace --attest dist/plugin-quality.json
submit runs scan, policy, and verify. It writes the quality artifact to the --attest path only when the score meets the minimum, the policy profile passes, and verify passes. The minimum is the profile's own minimum score unless you pass --min-score. It also accepts --config, --baseline, and --online, and it has no --format flag.
submit stays single-plugin on purpose so the artifact points at one concrete package. A marketplace root exits with an error. See Submission and registry payloads for the artifact shape.
doctor
Use doctor for targeted diagnostics or a troubleshooting bundle:
plugin-scanner doctor ./my-plugin --component mcp --bundle dist/doctor.zip
--component is one of all (default), manifest, marketplace, mcp, skills, apps, or assets. doctor always runs offline. Without --bundle it prints the report as JSON. With --bundle it writes a zip file that contains:
doctor-report.jsonenvironment.txt, with the working directory, Python version, and OS nameworkspace-manifest.txtcommand-metadata.jsonstdout.log,stderr.log, andtimeout-markers.txt
Read environment.txt and the logs before you attach a bundle to a public issue.
When to use which command
| Command | Best use |
|---|---|
scan | weighted release summary and policy evaluation |
lint | authoring feedback and safe mechanical fixes |
verify | manifest, marketplace, MCP, and asset readiness checks |
submit | artifact-backed release or submission gate |
doctor | targeted offline diagnostics and support bundles |