Mcp Security Scanner — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Security Scanner (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A repository security scanner for GitHub repositories, available as both an MCP server and a CLI tool. Orcorus clones a repo, runs static analysis, detects hardcoded secrets, verifies the build, and performs an AI-powered OWASP-aligned security code review — producing a scored SECURITY.md report.
scan_repo, get_report, and list_reports tools via FastMCPsrc/ # Core library
__init__.py # Public API: Scanner, ScanConfig, ScanResult
models.py # Data models (ScanConfig, ScanResult)
scanner.py # Main scanning pipeline
analyzers.py # Bandit, secrets, build, test, and quality checks
ai_review.py # Agentic AI security review loop
report.py # SECURITY.md report generation
server.py # MCP server (FastMCP)
scan_repo.py # CLI client# With AI review (GitHub repo)
python scan_repo.py https://github.com/owner/repo --api-key sk-...
# Without AI review
python scan_repo.py https://github.com/owner/repo --skip-ai
# Scan a local directory in-place (absolute --subdir path)
python scan_repo.py --name SSH-Command \
--subdir /srv/docker/orcorus-integrations/ssh-command \
--api-key sk-... --model gpt-5.4 --base-url https://api.cometapi.com/v1
# Scan current directory
python scan_repo.py .
# Custom model / provider
python scan_repo.py https://github.com/owner/repo \
--model gpt-5.2 \
--base-url https://api.openai.com/v1 \
--api-key sk-...If the claude CLI is installed and logged in, the scanner can hand the review to it instead of calling an API directly. Claude explores the checkout with its own read-only tools (Read, Grep, Glob, LS); no API key is needed.
python scan_repo.py https://github.com/owner/repo --ai-backend claude-cli # model: sonnet
python scan_repo.py https://github.com/owner/repo --ai-backend claude-cli --model opus
python scan_repo.py https://github.com/owner/repo --ai-backend claude-cli \
--ai-timeout 900 --max-budget-usd 2 --json-out result.jsonHow the CLI is invoked, and why:
claude -p --output-format json with the prompt on stdin; the JSON result carries the report plus cost and turn counts, which land in ScanResult.ai_cost_usd / ai_turns.Read,Grep,Glob,LS via --tools / --allowedTools, and Bash, Edit, Write, web and agent tools are disallowed, so the reviewer can only look.--setting-sources user and --strict-mcp-config stop a scanned repository's own .claude/settings.json, hooks or MCP config from being honoured. The system prompt also tells the model to treat CLAUDE.md, AGENTS.md and READMEs in the repo as untrusted evidence.--ai-timeout bounds the whole review for this backend (default 900s). --max-turns and --max-budget-usd are passed through when the installed CLI supports them.CLAUDECODE, CLAUDE_CODE_*) are stripped so a scan can be launched from inside a Claude Code session.Set ORCORUS_AI_BACKEND=claude-cli (and optionally ORCORUS_CLAUDE_BIN, ORCORUS_MODEL, ORCORUS_MAX_BUDGET_USD) to use the same backend from the MCP server. The Docker image does not ship the Claude CLI; this backend is meant for host runs.
python server.py
# or
fastmcp run server.pyThe server exposes three tools:
| Tool | Description |
|---|---|
scan_repo | Scan a GitHub repo (runs as a background task) |
get_report | Retrieve a completed SECURITY.md report by name |
list_reports | List all available scan reports with scores |
settings.json)Add the following to your MCP settings.json to run Orcorus as a Docker container:
{
"mcpServers": {
"scanner": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "OPENAI_API_KEY=sk-your-api-key-here",
"-e", "ORCORUS_MODEL=gpt-5.2",
"-e", "OPENAI_BASE_URL=https://api.openai.com/v1",
"-e", "ORCORUS_REPORTS_DIR=/app/reports",
"-e", "ORCORUS_WORK_DIR=/app/repos",
"-e", "ORCORUS_AI_TIMEOUT=300",
"-e", "ORCORUS_MAX_TURNS=40",
"orcorus/security_scanner:latest"
]
}
}
}To persist reports between runs, mount a volume:
{
"mcpServers": {
"scanner": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "OPENAI_API_KEY=sk-your-api-key-here",
"-e", "ORCORUS_MODEL=gpt-5.2",
"-e", "OPENAI_BASE_URL=https://api.openai.com/v1",
"-v", "/path/to/local/reports:/app/reports",
"orcorus/security_scanner:latest"
]
}
}
}To skip AI review (static analysis only), add -e, "ORCORUS_SKIP_AI=true" to the args.
| Argument | Default | Description |
|---|---|---|
repo_url | . | GitHub repository URL or local path (ignored when --subdir is absolute) |
--name | auto-detected | Display name for the report |
--commit | HEAD | Specific commit to checkout |
--subdir | (none) | Subdirectory scope, or an absolute path to scan a directory in-place without cloning |
--ai-backend | $ORCORUS_AI_BACKEND or openai | openai (API with tool calling) or claude-cli (Claude Code CLI in print mode) |
--claude-bin | claude | Claude CLI executable name for claude-cli |
--max-budget-usd | 0 | Spend cap per review for claude-cli (0 = none) |
--api-key | $OPENAI_API_KEY | API key for the LLM provider (openai backend) |
--model | gpt-5.2 / sonnet | Model to use for AI review (default depends on backend) |
--base-url | https://api.openai.com/v1 | OpenAI-compatible API base URL |
--reports-dir | ./reports | Directory to save reports |
--work-dir | ./repos | Where repositories are cloned |
--json-out | (none) | Also write the ScanResult as JSON to this path |
--ai-timeout | 300 / 900 | Timeout per AI call (openai) or for the whole review (claude-cli) |
--max-turns | 40 | Max agentic review turns |
--skip-ai | false | Skip the AI review step |
--keep-repo | false | Keep the cloned repo after scanning |
| Variable | Default | Description |
|---|---|---|
ORCORUS_AI_BACKEND | openai | openai or claude-cli |
ORCORUS_CLAUDE_BIN | claude | Claude CLI executable for claude-cli |
ORCORUS_MAX_BUDGET_USD | 0 | Spend cap per review for claude-cli |
OPENAI_API_KEY | (none) | API key for AI review (openai backend) |
ORCORUS_MODEL | gpt-5.2 / sonnet | LLM model name |
OPENAI_BASE_URL | https://api.openai.com/v1 | API base URL |
ORCORUS_REPORTS_DIR | ./reports | Reports output directory |
ORCORUS_WORK_DIR | ./repos | Temporary clone directory |
ORCORUS_AI_TIMEOUT | 300 | Timeout per AI call (seconds) |
ORCORUS_MAX_TURNS | 40 | Max agentic review turns |
ORCORUS_SKIP_AI | false | Set to 1 or true to skip AI review |
ORCORUS_ALLOW_LOCAL_PATHS | false | Set to 1 or true to allow scanning local filesystem paths via MCP |
| Score | Tier |
|---|---|
| 90–100 | Gold |
| 75–89 | Silver |
| 60–74 | Bronze |
| 0–59 | Reject |
Deductions are applied for high/medium/low Bandit findings, hardcoded secrets, build failures, missing tests, missing README, missing dependency files, and critical/high severity issues found during AI review.
openai backend; imported lazily)claude-cli backend~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.