Catalog PyPI
PACKAGE EXPLORERView in registry

agentfort

PyPI

CVE-style advisory database and static scanner for AI agent security risks

agentsaicrewailangchainllmmcpscannersecurity
Versions collected1
Direct dependencies4From release 0.1.5
Last observed20 Oct, 21:58 UTC

README

Version 0.1.5 documentation

AgentFort

Static security scanner for AI agent codebases. Analyzes repositories and MCP config files against a CVE-style advisory database — no live agent interaction required.

What it does

  • Scans Python repos for dangerous patterns: eval(), exec(), shell=True, hardcoded API keys
  • Parses MCP config files (claude_desktop_config.json, .mcp.json) for shell execution tools, overly broad filesystem access, and unverified npx/uvx packages
  • Detects agent framework imports (LangChain, CrewAI, AutoGen, OpenAI, Anthropic, etc.) and cross-references against known vulnerabilities
  • Queries OSV.dev live for real CVEs against every detected package — findings stay current without any database updates
  • Produces risk scores, terminal reports, Markdown, and JSON output
  • Exits with code 1 on critical findings — CI pipeline friendly

Install

# From repo root (inside a virtualenv)
pip install agentfort

# Or dev install from repo root
pip install -e .

Usage

# Scan a repo
agentfort scan --repo /path/to/your/agent-project

# Scan just an MCP config file
agentfort scan --mcp-config ~/.config/claude/claude_desktop_config.json

# JSON output (clean stdout, progress on stderr)
agentfort scan --repo . --format json

# Markdown report to file
agentfort scan --repo . --format md --output report.md

# Only show high and above
agentfort scan --repo . --min-severity high

# Disable CI exit code
agentfort scan --repo . --no-fail-on-critical

# Skip OSV live lookup (air-gapped / CI without outbound)
agentfort scan --repo . --offline

# Browse advisories
agentfort advisories list
agentfort advisories list --severity critical
agentfort advisories show AGSA-001

Pro tier — Alerts and Digest

Scan notifications

Post findings to Slack or email when a scan completes:

# Slack alert on critical findings
agentfort scan --repo . --notify-slack https://hooks.slack.com/services/...

# Email alert (requires SMTP env vars)
export AGENTFORT_SMTP_HOST=smtp.example.com
export AGENTFORT_SMTP_USER=alerts@example.com
export AGENTFORT_SMTP_PASS=secret
export AGENTFORT_SMTP_FROM=alerts@example.com
agentfort scan --repo . --notify-email team@example.com

# Env var shorthand (useful in CI secrets)
export AGENTFORT_SLACK_WEBHOOK=https://hooks.slack.com/services/...
agentfort scan --repo .

Weekly advisory digest

Send a digest of new advisories on a schedule:

# Show all advisories
agentfort digest

# Show only advisories added in the last 7 days
agentfort digest --since 7

# Post to Slack
agentfort digest --since 7 --slack $SLACK_WEBHOOK

# Email the digest
agentfort digest --since 7 --email team@example.com

Run the digest weekly via GitHub Actions scheduled workflow:

on:
  schedule:
    - cron: '0 9 * * 1'   # every Monday at 9am UTC

jobs:
  digest:
    runs-on: ubuntu-latest
    steps:
      - run: pip install agentfort
      - run: agentfort digest --since 7 --slack ${{ secrets.SLACK_WEBHOOK }}

GitHub Actions Pro inputs

- name: AgentFort Security Scan
  uses: ./.github/actions/agentfort
  with:
    repo-path: '.'
    fail-on-critical: 'true'
    offline: 'true'
    slack-webhook: ${{ secrets.SLACK_WEBHOOK }}      # optional
    notify-email: 'team@example.com'                  # optional

GitHub Actions

Add AgentFort to any CI pipeline with one step. The action installs agentfort from PyPI and runs a full scan — failing the build on critical findings by default.

- name: AgentFort Security Scan
  uses: NeuronKnight/agentfort-action@v1
  with:
    repo-path: '.'           # directory to scan (default: .)
    min-severity: 'low'      # critical | high | medium | low (default: low)
    fail-on-critical: 'true' # fail build on critical findings (default: true)
    offline: 'false'         # skip OSV.dev live CVE lookup (default: false)

Full workflow example:

name: Security Scan

on: [push, pull_request]

jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: NeuronKnight/agentfort-action@v1
        with:
          min-severity: high
          fail-on-critical: 'true'

Note: NeuronKnight/agentfort-action is the planned standalone Action repo. Until it's published, use the local action from this repo: uses: ./.github/actions/agentfort.

Live CVE lookup (OSV.dev)

Every scan queries OSV.dev in parallel for known CVEs against every package detected in the repo. No database to update — findings reflect OSV's current state on each run.

  • Results are capped at 5 CVEs per package (highest severity first) to avoid noise from very old pinned versions
  • Uses GHSA severity labels (database_specific.severity) for accurate critical/high/medium/low mapping
  • Falls back silently if the network is unreachable — use --offline to skip the lookup entirely
# Scan with live CVEs (default)
agentfort scan --repo .

# Air-gapped / no outbound network
agentfort scan --repo . --offline

Ignoring paths

Create .agentfortignore in your repo root to exclude directories or files from scanning. Uses gitignore-style glob patterns:

# .agentfortignore

# Ignore generated code
generated/

# Ignore vendor directory
vendor/

# Ignore specific file pattern
*.pb.py

The scanner skips any file whose path matches a pattern. Useful for:

  • Vendored code you don't control
  • Test fixtures that intentionally contain vulnerable patterns
  • Generated files with no manual security surface

Advisory database

14 static advisories covering structural/behavioral risks from the OWASP Agentic Top 10. Package CVEs are handled live by OSV.dev (see above).

IDSeverityRisk
AGSA-001CriticalLangChain ShellTool unrestricted shell execution
AGSA-002CriticalMCP server exposes shell execution tool
AGSA-003Criticaleval()/exec() in agent tool handler
AGSA-005CriticalAutoGen/CrewAI code execution without confirmation
AGSA-004HighHardcoded API key or secret in MCP config
AGSA-006HighMCP filesystem server with overly broad path (/, ~)
AGSA-007Highsubprocess with shell=True or os.system()
AGSA-008HighAgent tool writes to arbitrary file paths
AGSA-010HighPrompt injection via unvalidated tool output
AGSA-013HighOpenAI Assistants file_search/code_interpreter without scope restriction
AGSA-009MediumMCP server loaded via unverified npx/uvx package
AGSA-012MediumSecrets exposed via os.environ in tool scope
AGSA-014MediumNon-PyPI/non-npm dependency as framework component
AGSA-015MediumSystem prompt in user-accessible config location

Risk score

0–100. Each finding adds: critical=40, high=15, medium=5, low=1. Capped at 100.

Output formats

Terminal (default) — Rich panels with color-coded severity table and detail panels for critical/high findings.

JSON — Machine-readable. Progress messages go to stderr so stdout is clean for piping:

agentfort scan --repo . --format json 2>/dev/null | jq '.findings[] | select(.severity=="critical")'

Markdown — Full report with summary table and per-finding sections, suitable for GitHub issues or PR comments.

Project structure

agentfort/                  # project root
├── agentfort/              # Python package
│   ├── cli.py              # Click CLI entry point
│   ├── models.py           # Finding, ScanResult dataclasses
│   ├── db/
│   │   ├── advisory.py     # Advisory loader and index
│   │   └── data/           # AGSA-001.yaml … AGSA-015.yaml
│   ├── scanner/
│   │   ├── frameworks.py   # requirements.txt / pyproject.toml / package.json
│   │   ├── mcp.py          # MCP config file scanner
│   │   ├── osv.py          # Live CVE lookup via OSV.dev API
│   │   ├── patterns.py     # Python source pattern scanner
│   │   └── secrets.py      # Hardcoded credential scanner
│   └── report/
│       └── formatter.py    # Terminal, Markdown, JSON renderers
└── pyproject.toml

Downloads & popularity

2downloads
1-day window · source-reported counts19 Oct 2026
1890
2026-07-22: 3 · observed 2026-10-20T22:50:19.2913964Z · period 2026-07-22–2026-07-222026-07-23: 2 · observed 2026-10-20T22:50:19.2913964Z · period 2026-07-23–2026-07-232026-07-24: 2 · observed 2026-10-20T22:50:19.2913964Z · period 2026-07-24–2026-07-242026-07-27: 3 · observed 2026-10-20T22:50:19.2913964Z · period 2026-07-27–2026-07-272026-08-02: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-08-02–2026-08-022026-08-04: 3 · observed 2026-10-20T22:50:19.2913964Z · period 2026-08-04–2026-08-042026-08-09: 5 · observed 2026-10-20T22:50:19.2913964Z · period 2026-08-09–2026-08-092026-08-14: 4 · observed 2026-10-20T22:50:19.2913964Z · period 2026-08-14–2026-08-142026-08-17: 2 · observed 2026-10-20T22:50:19.2913964Z · period 2026-08-17–2026-08-172026-08-23: 3 · observed 2026-10-20T22:50:19.2913964Z · period 2026-08-23–2026-08-232026-08-24: 16 · observed 2026-10-20T22:50:19.2913964Z · period 2026-08-24–2026-08-242026-08-28: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-08-28–2026-08-282026-08-31: 2 · observed 2026-10-20T22:50:19.2913964Z · period 2026-08-31–2026-08-312026-09-01: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-01–2026-09-012026-09-03: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-03–2026-09-032026-09-05: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-05–2026-09-052026-09-07: 4 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-07–2026-09-072026-09-08: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-08–2026-09-082026-09-10: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-10–2026-09-102026-09-12: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-12–2026-09-122026-09-13: 10 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-13–2026-09-132026-09-14: 2 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-14–2026-09-142026-09-16: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-16–2026-09-162026-09-20: 18 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-20–2026-09-202026-09-22: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-22–2026-09-222026-09-23: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-23–2026-09-232026-09-26: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-26–2026-09-262026-09-27: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-27–2026-09-272026-09-28: 3 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-28–2026-09-282026-09-30: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-09-30–2026-09-302026-10-01: 2 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-01–2026-10-012026-10-02: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-02–2026-10-022026-10-04: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-04–2026-10-042026-10-05: 4 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-05–2026-10-052026-10-06: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-06–2026-10-062026-10-08: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-08–2026-10-082026-10-09: 2 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-09–2026-10-092026-10-10: 8 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-10–2026-10-102026-10-11: 12 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-11–2026-10-112026-10-12: 3 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-12–2026-10-122026-10-13: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-13–2026-10-132026-10-14: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-14–2026-10-142026-10-15: 7 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-15–2026-10-152026-10-16: 1 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-16–2026-10-162026-10-17: 11 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-17–2026-10-172026-10-18: 4 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-18–2026-10-182026-10-19: 2 · observed 2026-10-20T22:50:19.2913964Z · period 2026-10-19–2026-10-19
22 Jul19 Oct

pypistats · 47 observations shown. Missing days are unknown. Source category: overall: without mirrors.

View observed values
Date / source periodValueObserved at
2026-10-19 – 2026-10-1922026-10-20T22:50:19.2913964Z
2026-10-18 – 2026-10-1842026-10-20T22:50:19.2913964Z
2026-10-17 – 2026-10-17112026-10-20T22:50:19.2913964Z
2026-10-16 – 2026-10-1612026-10-20T22:50:19.2913964Z
2026-10-15 – 2026-10-1572026-10-20T22:50:19.2913964Z
2026-10-14 – 2026-10-1412026-10-20T22:50:19.2913964Z
2026-10-13 – 2026-10-1312026-10-20T22:50:19.2913964Z
2026-10-12 – 2026-10-1232026-10-20T22:50:19.2913964Z
2026-10-11 – 2026-10-11122026-10-20T22:50:19.2913964Z
2026-10-10 – 2026-10-1082026-10-20T22:50:19.2913964Z
2026-10-09 – 2026-10-0922026-10-20T22:50:19.2913964Z
2026-10-08 – 2026-10-0812026-10-20T22:50:19.2913964Z
2026-10-06 – 2026-10-0612026-10-20T22:50:19.2913964Z
2026-10-05 – 2026-10-0542026-10-20T22:50:19.2913964Z
2026-10-04 – 2026-10-0412026-10-20T22:50:19.2913964Z
2026-10-02 – 2026-10-0212026-10-20T22:50:19.2913964Z
2026-10-01 – 2026-10-0122026-10-20T22:50:19.2913964Z
2026-09-30 – 2026-09-3012026-10-20T22:50:19.2913964Z
2026-09-28 – 2026-09-2832026-10-20T22:50:19.2913964Z
2026-09-27 – 2026-09-2712026-10-20T22:50:19.2913964Z
2026-09-26 – 2026-09-2612026-10-20T22:50:19.2913964Z
2026-09-23 – 2026-09-2312026-10-20T22:50:19.2913964Z
2026-09-22 – 2026-09-2212026-10-20T22:50:19.2913964Z
2026-09-20 – 2026-09-20182026-10-20T22:50:19.2913964Z
2026-09-16 – 2026-09-1612026-10-20T22:50:19.2913964Z
2026-09-14 – 2026-09-1422026-10-20T22:50:19.2913964Z
2026-09-13 – 2026-09-13102026-10-20T22:50:19.2913964Z
2026-09-12 – 2026-09-1212026-10-20T22:50:19.2913964Z
2026-09-10 – 2026-09-1012026-10-20T22:50:19.2913964Z
2026-09-08 – 2026-09-0812026-10-20T22:50:19.2913964Z
2026-09-07 – 2026-09-0742026-10-20T22:50:19.2913964Z
2026-09-05 – 2026-09-0512026-10-20T22:50:19.2913964Z
2026-09-03 – 2026-09-0312026-10-20T22:50:19.2913964Z
2026-09-01 – 2026-09-0112026-10-20T22:50:19.2913964Z
2026-08-31 – 2026-08-3122026-10-20T22:50:19.2913964Z
2026-08-28 – 2026-08-2812026-10-20T22:50:19.2913964Z
2026-08-24 – 2026-08-24162026-10-20T22:50:19.2913964Z
2026-08-23 – 2026-08-2332026-10-20T22:50:19.2913964Z
2026-08-17 – 2026-08-1722026-10-20T22:50:19.2913964Z
2026-08-14 – 2026-08-1442026-10-20T22:50:19.2913964Z
2026-08-09 – 2026-08-0952026-10-20T22:50:19.2913964Z
2026-08-04 – 2026-08-0432026-10-20T22:50:19.2913964Z
2026-08-02 – 2026-08-0212026-10-20T22:50:19.2913964Z
2026-07-27 – 2026-07-2732026-10-20T22:50:19.2913964Z
2026-07-24 – 2026-07-2422026-10-20T22:50:19.2913964Z
2026-07-23 – 2026-07-2322026-10-20T22:50:19.2913964Z
2026-07-22 – 2026-07-2232026-10-20T22:50:19.2913964Z

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.1.513 Jun 20264

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

PENDING
neuronknight/agentfort

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 21:58 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:262368359bf3c46c06b727eb0bf2335e74379a13f41e8c7d5a39af4dcb6a1b84